-
Notifications
You must be signed in to change notification settings - Fork 1.4k
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
- Loading branch information
Showing
1 changed file
with
36 additions
and
35 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -1,59 +1,60 @@ | ||
# Aliasing | ||
|
||
Data can be immutably borrowed any number of times, but while immutably | ||
borrowed, the original data can't be mutably borrowed. On the other hand, | ||
only *one* mutable borrow is allowed at a time. The original data can be | ||
borrowed again only *after* the mutable reference goes out of scope. | ||
borrowed, the original data can't be mutably borrowed. On the other hand, only | ||
*one* mutable borrow is allowed at a time. The original data can be borrowed | ||
again only *after* the mutable reference has been used for the last time. | ||
|
||
```rust,editable | ||
struct Point { x: i32, y: i32, z: i32 } | ||
fn main() { | ||
let mut point = Point { x: 0, y: 0, z: 0 }; | ||
{ | ||
let borrowed_point = &point; | ||
let another_borrow = &point; | ||
let borrowed_point = &point; | ||
let another_borrow = &point; | ||
// Data can be accessed via the references and the original owner | ||
println!("Point has coordinates: ({}, {}, {})", | ||
borrowed_point.x, another_borrow.y, point.z); | ||
// Data can be accessed via the references and the original owner | ||
println!("Point has coordinates: ({}, {}, {})", | ||
borrowed_point.x, another_borrow.y, point.z); | ||
// Error! Can't borrow `point` as mutable because it's currently | ||
// borrowed as immutable. | ||
//let mutable_borrow = &mut point; | ||
// TODO ^ Try uncommenting this line | ||
// Error! Can't borrow `point` as mutable because it's currently | ||
// borrowed as immutable. | ||
// let mutable_borrow = &mut point; | ||
// TODO ^ Try uncommenting this line | ||
// Immutable references go out of scope | ||
} | ||
// The borrowed values are used again here | ||
println!("Point has coordinates: ({}, {}, {})", | ||
borrowed_point.x, another_borrow.y, point.z); | ||
{ | ||
let mutable_borrow = &mut point; | ||
// The immutable references are no longer used for the rest of the code so | ||
// it is possible to reborrow with a mutbale reference. | ||
let mutable_borrow = &mut point; | ||
// Change data via mutable reference | ||
mutable_borrow.x = 5; | ||
mutable_borrow.y = 2; | ||
mutable_borrow.z = 1; | ||
// Change data via mutable reference | ||
mutable_borrow.x = 5; | ||
mutable_borrow.y = 2; | ||
mutable_borrow.z = 1; | ||
// Error! Can't borrow `point` as immutable because it's currently | ||
// borrowed as mutable. | ||
//let y = &point.y; | ||
// TODO ^ Try uncommenting this line | ||
// Error! Can't borrow `point` as immutable because it's currently | ||
// borrowed as mutable. | ||
// let y = &point.y; | ||
// TODO ^ Try uncommenting this line | ||
// Error! Can't print because `println!` takes an immutable reference. | ||
//println!("Point Z coordinate is {}", point.z); | ||
// TODO ^ Try uncommenting this line | ||
// Error! Can't print because `println!` takes an immutable reference. | ||
// println!("Point Z coordinate is {}", point.z); | ||
// TODO ^ Try uncommenting this line | ||
// Ok! Mutable references can be passed as immutable to `println!` | ||
println!("Point has coordinates: ({}, {}, {})", | ||
mutable_borrow.x, mutable_borrow.y, mutable_borrow.z); | ||
// Ok! Mutable references can be passed as immutable to `println!` | ||
println!("Point has coordinates: ({}, {}, {})", | ||
mutable_borrow.x, mutable_borrow.y, mutable_borrow.z); | ||
// Mutable reference goes out of scope | ||
} | ||
// The mutable reference is no longer used for the rest of the code so it | ||
// is possible to reborrow. | ||
// Immutable references to `point` are allowed again | ||
let borrowed_point = &point; | ||
let new_borrowed_point = &point; | ||
println!("Point now has coordinates: ({}, {}, {})", | ||
borrowed_point.x, borrowed_point.y, borrowed_point.z); | ||
new_borrowed_point.x, new_borrowed_point.y, new_borrowed_point.z); | ||
} | ||
``` |