代码之家  ›  专栏  ›  技术社区  ›  sgon00

为什么*RefMut<i32>可以直接使用,但不能分配给rust中的变量?

  •  0
  • sgon00  · 技术社区  · 3 年前

    我正在学习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章(几乎是书的结尾)。

    0 回复  |  直到 3 年前