这是一个简单的代码,显示错误cannot assign to a because it is borrowed assi gnment to borrowed a occurs here。如果借用,是否可以赋值?
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); }
w8rqjzmb1#
fn main() { let mut a = 20; { let b = &a; println!("{}", b); } // Shared reference goes out of scope here a = 20; println!("{}", a); }
50few1ms2#
没有interior mutability就不行。不允许改变一个被借用的值可以防止许多不同类型的bug。例如,当你有一个对Vec中的值的共享引用时,你不能推送到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,因为细胞可以通过共享引用进行突变。
a
mut
2条答案
按热度按时间w8rqjzmb1#
50few1ms2#
没有interior mutability就不行。
不允许改变一个被借用的值可以防止许多不同类型的bug。例如,当你有一个对
Vec
中的值的共享引用时,你不能推送到Vec
上。这看起来是任意的,但是如果推送导致内部重新分配,以前分配的引用将变为悬空的。下面是内部可变性方法的情况:
注意
a
甚至不需要声明为mut
,因为细胞可以通过共享引用进行突变。