rust 如果a是借来的,我们能给它赋值吗?

umuewwlo  于 2023-01-21  发布在  其他
关注(0)|答案(2)|浏览(112)

这是一个简单的代码,显示错误cannot assign to a because it is borrowed assi gnment to borrowed a occurs here。如果借用,是否可以赋值?

fn main() {
    let mut a = 20;
    let b = &a;

    a = 20;
    println!("{}, {}", a, b);
}
w8rqjzmb

w8rqjzmb1#

  • Rust* 在编译时强制执行“多个读取器或单个写入器”规则。只要存在对某个值的可变引用,您就不能使用所有者,直到该可变引用消失。类似地,***只要存在对值的多个共享引用,即使它的所有者也不能修改它 *。**例如,这将编译。
fn main() {
    let mut a = 20;
    {
        let b = &a;
        println!("{}", b);
    } // Shared reference goes out of scope here
    a = 20;
    println!("{}", a);
}
50few1ms

50few1ms2#

没有interior mutability就不行。
不允许改变一个被借用的值可以防止许多不同类型的bug。例如,当你有一个对Vec中的值的共享引用时,你不能推送到Vec上。这看起来是任意的,但是如果推送导致内部重新分配,以前分配的引用将变为悬空的。
下面是内部可变性方法的情况:

use std::cell::Cell;

fn main() {
    let a = Cell::new(20);
    let b = &a;

    a.set(10);
    println!("{}, {}", a.get(), b.get());
}

注意a甚至不需要声明为mut,因为细胞可以通过共享引用进行突变。

相关问题