rust 的指针问题

jeesk · 2024-9-10 17:11:27 · 62 次点击
```
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 不允许这样?
举报· 62 次点击
登录 注册 站外分享
5 条回复  
binhb 小成 2024-9-10 17:51:20
可变引用与不可变引用的作用域不能交叠
lzoje 初学 2024-9-10 17:53:19
let y = &mut x; 就是把 x 的写权限交给了 y 。rust 里写权限是唯一的,只能由一个对象持有。
daolanfler 小成 2024-9-10 18:01:24
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)
natsu94 小成 2024-9-10 18:04:25
这是 rust 管理内存的方式,你按他来能做到他声称的内存安全,golang 则是由垃圾回收来做到
libook 小成 2024-9-10 18:07:34
编译器已经说很明白了,let y = &mut x;这一行 x 已经被可变借用了,下面 println!要重复借用,Rust 里可变借用是排他的,因为你不不知道上一个借走的会不会修改了它的值导致下一个读到的是脏数据(数据竞争),你可以再问问 GPT 怎么安全地在多个地方可变借用,有很多语法糖可以用。
返回顶部