@@ -1067,6 +1067,28 @@ let mut d = @mut 5; // mutable variable, mutable box
1067
1067
d = @mut 15;
1068
1068
~~~~
1069
1069
1070
+ A mutable variable and an immutable variable can refer to the same box, given
1071
+ that their types are compatible. Mutability of a box is a property of its type,
1072
+ however, so for example a mutable handle to an immutable box cannot be
1073
+ assigned a reference to a mutable box.
1074
+
1075
+ ~~~~
1076
+ let a = @1; // immutable box
1077
+ let b = @mut 2; // mutable box
1078
+
1079
+ let mut c : @int; // declare a variable with type managed immutable int
1080
+ let mut d : @mut int; // and one of type managed mutable int
1081
+
1082
+ c = a; // box type is the same, okay
1083
+ d = b; // box type is the same, okay
1084
+ ~~~~
1085
+
1086
+ ~~~~ {.xfail-test}
1087
+ // but b cannot be assigned to c, or a to d
1088
+ c = b; // error
1089
+ ~~~~
1090
+
1091
+
1070
1092
# Move semantics
1071
1093
1072
1094
Rust uses a shallow copy for parameter passing, assignment and returning values
@@ -1081,6 +1103,16 @@ let y = x.clone(); // y is a newly allocated box
1081
1103
let z = x; // no new memory allocated, x can no longer be used
1082
1104
~~~~
1083
1105
1106
+ Since in owned boxes mutability is a property of the owner, not the
1107
+ box, mutable boxes may become immutable when they are moved, and vice-versa.
1108
+
1109
+ ~~~~
1110
+ let r = ~13;
1111
+ let mut s = r; // box becomes mutable
1112
+ *s += 1;
1113
+ let t = s; // box becomes immutable
1114
+ ~~~~
1115
+
1084
1116
# Borrowed pointers
1085
1117
1086
1118
Rust's borrowed pointers are a general purpose reference type. In contrast with
0 commit comments