use std::fmt::Debug;
fn main() {
let mut x = 100;
let y = &mut x;
*y = 100;
*y = 200;
// rust 不允许同时访问(x,y), 但是在 golang 里面可以这样使用。
println!("{}", x);
println!("{}",*y)
}
上面的代码在 rust 里面不可以使用, 问了 chatgpt 感觉没听懂, 有没有大佬能够通俗易懂的讲解一下, 为什么 rust 不允许这样?
1
binhb 79 天前 1
可变引用与不可变引用的作用域不能交叠
|
2
lzoje 79 天前
let y = &mut x; 就是把 x 的写权限交给了 y 。rust 里写权限是唯一的,只能由一个对象持有。
|
4
daolanfler 79 天前
println!("{}", x); // 这里是 immutable reference
println!("{}", y); // 这里是 mutable reference borrow checker 会会报错。 至于为什么单独 print 没问题,是因为 borrow checker 能在编译期检生命周期,知道后面没有冲突地使用 [the book 上有个类似的例子]( https://doc.rust-lang.org/book/ch04-02-references-and-borrowing.html#:~:text=Note%20that%20a%20reference%E2%80%99s%20scope%20starts%20from%20where%20it%20is%20introduced%20and%20continues%20through%20the%20last%20time%20that%20reference%20is%20used.%20For%20instance%2C%20this%20code%20will%20compile%20because%20the%20last%20usage%20of%20the%20immutable%20references%2C%20the%20println!%2C%20occurs%20before%20the%20mutable%20reference%20is%20introduced%3A) |
5
natsu94 79 天前
这是 rust 管理内存的方式,你按他来能做到他声称的内存安全,golang 则是由垃圾回收来做到
|
6
libook 79 天前
编译器已经说很明白了,let y = &mut x;这一行 x 已经被可变借用了,下面 println!要重复借用,Rust 里可变借用是排他的,因为你不不知道上一个借走的会不会修改了它的值导致下一个读到的是脏数据(数据竞争),你可以再问问 GPT 怎么安全地在多个地方可变借用,有很多语法糖可以用。
|