我正在学习Rust并阅读智能指针章节:
https://doc.rust-lang.org/book/ch15-05-interior-mutability.html
。
然后我尝试了以下代码(自己的代码):
fn main () {
let x = Rc::new(RefCell::new(5));
let y = Rc::clone(&x);
let z = Rc::clone(&x);
{
let mut tmp = y.borrow_mut();
*tmp = *tmp + 1;
}
println!("{} - {} - {}" , x.borrow(), y.borrow(), z.borrow());
}
它打印“6-6-6”。因此
*tmp = *tmp + 1;
确实增加了该内存位置中的一个。以某种方式
*RefMut<i32>
可以同时被认为是存储器位置及其值。
但是如果我尝试分配
*RefMut<i32>
对于变量,它将不起作用:
let mut tmp2 = *y.borrow_mut();
tmp2 = tmp2 + 1;
tmp2
只是一个
i32
数字类型。增加它与的内存位置无关
x
,
y
,
z
。
我想我能理解大部分。但我真的不明白为什么
*tmp=*tmp+1;
如果
*tmp
只是一个i32数字类型。
可以分配吗
*RefMut<i32>
到一个变量,这样我就不需要使用
*
加号运算中的符号?
已编辑
感谢@Locke的评论。我知道
*x = something
是Rust中的一种特殊语法。意思是“将值设置为x的内存位置”。因此,我无法摆脱
*
符号,因为它是语法的一部分。我尝试了以下简单的例子,它证明了:
fn main() {
let mut x = 5;
let y = &mut x;
*y = 7;
println!("{}", x);
}
顺便说一句,官方的书中没有提到这种行为,我正在读第15.6章(几乎是书的结尾)。