Files
rust-by-practice/solutions/ownership/borrowing.md
Léon 1c83c69d30 fix: Correct the wrong answer to Exercise 11 in Chapter borrowing
Calling only r1 in the new compiler version does not trigger a reborrowing error
2023-08-30 18:48:08 +08:00

155 lines
2.0 KiB
Markdown
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

1.
```rust
fn main() {
let x = 5;
// fill the blank
let p = &x;
println!("the memory address of x is {:p}", p); // one possible output: 0x16fa3ac84
}
```
2.
```rust
fn main() {
let x = 5;
let y = &x;
// modify this line only
assert_eq!(5, *y);
}
```
3.
```rust
fn main() {
let mut s = String::from("hello, ");
borrow_object(&s)
}
fn borrow_object(s: &String) {}
```
4.
```rust
fn main() {
let mut s = String::from("hello, ");
push_str(&mut s)
}
fn push_str(s: &mut String) {
s.push_str("world")
}
```
5.
```rust
fn main() {
let mut s = String::from("hello, ");
// fill the blank to make it work
let p = &mut s;
p.push_str("world");
}
```
6.
```rust
fn main() {
let c = '中';
let r1 = &c;
// fill the blankdont change other code
let ref r2 = c;
assert_eq!(*r1, *r2);
// check the equality of the two address strings
assert_eq!(get_addr(r1),get_addr(r2));
}
// get memory address string
fn get_addr(r: &char) -> String {
format!("{:p}", r)
}
```
7.
```rust
fn main() {
let s = String::from("hello");
let r1 = &s;
let r2 = &s;
println!("{}, {}", r1, r2);
}
```
8.
```rust
fn main() {
//fix error by modifying this line
let mut s = String::from("hello, ");
borrow_object(&mut s)
}
fn borrow_object(s: &mut String) {}
```
9.
```rust
fn main() {
let mut s = String::from("hello, ");
borrow_object(&s);
s.push_str("world");
}
fn borrow_object(s: &String) {}
```
10.
```rust
fn main() {
let mut s = String::from("hello, ");
let r1 = &mut s;
r1.push_str("world");
let r2 = &mut s;
r2.push_str("!");
// println!("{}",r1);
}
```
11.
```rust
fn main() {
let mut s = String::from("hello, ");
let r1 = &mut s;
let r2 = &mut s;
// add one line below to make a compiler error: cannot borrow `s` as mutable more than once at a time
// you can't use r1 and r2 at the same time
println!("{}, {}", r1, r2);
}
```