jeesk
V2EX  ›  Rust

rust 的指针问题

  •  
  •   jeesk · Sep 10, 2024 · 2492 views
    This topic created in 650 days ago, the information mentioned may be changed or developed.
    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 replies    2024-09-10 18:07:34 +08:00
    binhb
        1
    binhb  
       Sep 10, 2024   ❤️ 1
    可变引用与不可变引用的作用域不能交叠
    lzoje
        2
    lzoje  
       Sep 10, 2024
    let y = &mut x; 就是把 x 的写权限交给了 y 。rust 里写权限是唯一的,只能由一个对象持有。
    binhb
        3
    binhb  
       Sep 10, 2024
    @binhb 补充下 println! 中默认会对所有权变量做不可变借用操作
    daolanfler
        4
    daolanfler  
       Sep 10, 2024
    natsu94
        5
    natsu94  
       Sep 10, 2024
    这是 rust 管理内存的方式,你按他来能做到他声称的内存安全,golang 则是由垃圾回收来做到
    libook
        6
    libook  
       Sep 10, 2024
    编译器已经说很明白了,let y = &mut x;这一行 x 已经被可变借用了,下面 println!要重复借用,Rust 里可变借用是排他的,因为你不不知道上一个借走的会不会修改了它的值导致下一个读到的是脏数据(数据竞争),你可以再问问 GPT 怎么安全地在多个地方可变借用,有很多语法糖可以用。
    About   ·   Help   ·   Advertise   ·   Blog   ·   API   ·   FAQ   ·   Solana   ·   5488 Online   Highest 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 40ms · UTC 01:39 · PVG 09:39 · LAX 18:39 · JFK 21:39
    ♥ Do have faith in what you're doing.