librustc: Remove cross-borrowing of Box<T> to &T from the language,
except where trait objects are involved. Part of issue #15349, though I'm leaving it open for trait objects. Cross borrowing for trait objects remains because it is needed until we have DST. This will break code like: fn foo(x: &int) { ... } let a = box 3i; foo(a); Change this code to: fn foo(x: &int) { ... } let a = box 3i; foo(&*a); [breaking-change]
This commit is contained in:
parent
ca24abd4d2
commit
de70d76373
72 changed files with 206 additions and 204 deletions
|
|
@ -67,7 +67,7 @@ Now we can call `compute_distance()`:
|
|||
# let on_the_stack : Point = Point{x: 3.0, y: 4.0};
|
||||
# let on_the_heap : Box<Point> = box Point{x: 7.0, y: 9.0};
|
||||
# fn compute_distance(p1: &Point, p2: &Point) -> f64 { 0.0 }
|
||||
compute_distance(&on_the_stack, on_the_heap);
|
||||
compute_distance(&on_the_stack, &*on_the_heap);
|
||||
~~~
|
||||
|
||||
Here, the `&` operator takes the address of the variable
|
||||
|
|
@ -77,10 +77,9 @@ value. We also call this _borrowing_ the local variable
|
|||
`on_the_stack`, because we have created an alias: that is, another
|
||||
name for the same data.
|
||||
|
||||
In the case of `on_the_heap`, however, no explicit action is necessary.
|
||||
The compiler will automatically convert a box point to a reference like &point.
|
||||
This is another form of borrowing; in this case, the contents of the owned box
|
||||
are being lent out.
|
||||
Likewise, in the case of `owned_box`,
|
||||
the `&` operator is used in conjunction with the `*` operator
|
||||
to take a reference to the contents of the box.
|
||||
|
||||
Whenever a caller lends data to a callee, there are some limitations on what
|
||||
the caller can do with the original. For example, if the contents of a
|
||||
|
|
|
|||
|
|
@ -279,7 +279,7 @@ fn main() {
|
|||
let origin = &Point { x: 0.0, y: 0.0 };
|
||||
let p1 = box Point { x: 5.0, y: 3.0 };
|
||||
|
||||
println!("{}", compute_distance(origin, p1));
|
||||
println!("{}", compute_distance(origin, &*p1));
|
||||
}
|
||||
~~~
|
||||
|
||||
|
|
|
|||
|
|
@ -3243,7 +3243,7 @@ enum List { Nil, Cons(uint, Box<List>) }
|
|||
fn is_sorted(list: &List) -> bool {
|
||||
match *list {
|
||||
Nil | Cons(_, box Nil) => true,
|
||||
Cons(x, ref r @ box Cons(y, _)) => (x <= y) && is_sorted(*r)
|
||||
Cons(x, ref r @ box Cons(y, _)) => (x <= y) && is_sorted(&**r)
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -1470,7 +1470,7 @@ Now we can call `compute_distance()` in various ways:
|
|||
# let on_the_stack : Point = Point { x: 3.0, y: 4.0 };
|
||||
# let on_the_heap : Box<Point> = box Point { x: 7.0, y: 9.0 };
|
||||
# fn compute_distance(p1: &Point, p2: &Point) -> f64 { 0.0 }
|
||||
compute_distance(&on_the_stack, on_the_heap);
|
||||
compute_distance(&on_the_stack, &*on_the_heap);
|
||||
~~~
|
||||
|
||||
Here the `&` operator is used to take the address of the variable
|
||||
|
|
@ -1480,11 +1480,9 @@ reference. We also call this _borrowing_ the local variable
|
|||
`on_the_stack`, because we are creating an alias: that is, another
|
||||
route to the same data.
|
||||
|
||||
In the case of `owned_box`, however, no
|
||||
explicit action is necessary. The compiler will automatically convert
|
||||
a box `box point` to a reference like
|
||||
`&point`. This is another form of borrowing; in this case, the
|
||||
contents of the owned box are being lent out.
|
||||
Likewise, in the case of `owned_box`,
|
||||
the `&` operator is used in conjunction with the `*` operator
|
||||
to take a reference to the contents of the box.
|
||||
|
||||
Whenever a value is borrowed, there are some limitations on what you
|
||||
can do with the original. For example, if the contents of a variable
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue