V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
jeesk
V2EX  ›  Rust

rust 的指针问题

  •  
  •   jeesk · 108 天前 · 1410 次点击
    这是一个创建于 108 天前的主题,其中的信息可能已经有所发展或是发生改变。
    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 不允许这样?

    6 条回复    2024-09-10 18:07:34 +08:00
    binhb
        1
    binhb  
       107 天前   ❤️ 1
    可变引用与不可变引用的作用域不能交叠
    lzoje
        2
    lzoje  
       107 天前
    let y = &mut x; 就是把 x 的写权限交给了 y 。rust 里写权限是唯一的,只能由一个对象持有。
    binhb
        3
    binhb  
       107 天前
    @binhb 补充下 println! 中默认会对所有权变量做不可变借用操作
    daolanfler
        4
    daolanfler  
       107 天前
    natsu94
        5
    natsu94  
       107 天前
    这是 rust 管理内存的方式,你按他来能做到他声称的内存安全,golang 则是由垃圾回收来做到
    libook
        6
    libook  
       107 天前
    编译器已经说很明白了,let y = &mut x;这一行 x 已经被可变借用了,下面 println!要重复借用,Rust 里可变借用是排他的,因为你不不知道上一个借走的会不会修改了它的值导致下一个读到的是脏数据(数据竞争),你可以再问问 GPT 怎么安全地在多个地方可变借用,有很多语法糖可以用。
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   4767 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 21ms · UTC 09:46 · PVG 17:46 · LAX 01:46 · JFK 04:46
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.