Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/rust/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Rust 什么';添加时对i32的不可变引用和可变引用之间的区别是什么?_Rust_Mutable - Fatal编程技术网

Rust 什么';添加时对i32的不可变引用和可变引用之间的区别是什么?

Rust 什么';添加时对i32的不可变引用和可变引用之间的区别是什么?,rust,mutable,Rust,Mutable,我有 第三个函数,plus\u one\u mut编译失败,原因是:错误[E0369]:二进制操作“+”不能应用于类型“&mut i32” 为什么带有可变引用的函数无法编译?如错误消息所示: 二进制操作+不能应用于类型“&mut i32” 那是因为它没有实现。回顾一下,您将看到Add的这些实现: impl-Add for i32 impl for i32 impl add奇怪的是,x.add(1)在所有情况下都有效。。。在这种情况下,可能会出现强迫?@PaoloFalabella我不确定强迫何

我有

第三个函数,
plus\u one\u mut
编译失败,原因是:
错误[E0369]:二进制操作“+”不能应用于类型“&mut i32”


为什么带有可变引用的函数无法编译?

如错误消息所示:

二进制操作+不能应用于类型“&mut i32”

那是因为它没有实现。回顾一下,您将看到
Add
的这些实现:

  • impl-Add for i32
  • impl for i32

  • impl add奇怪的是,
    x.add(1)
    在所有情况下都有效。。。在这种情况下,可能会出现强迫?@PaoloFalabella我不确定强迫何时是正确的术语;但是,是的,我认为这是起作用的。所以在这个例子中,
    &T
    的行为就像
    T
    一样。一般来说,我应该在使用不可变引用之前取消引用它们吗?或者,对于
    &T
    ,实现大多数
    T
    方法是非常普遍的吗?@turbulence我也不确定我是否明白你的意思。如果您有一个值,则可以调用该类型的方法,这些方法不带任何仪式地接受
    &self
    self
    。您是否将该方法实现为采用
    self
    &self
    归结为函数需要做什么。我敢打赌,大多数方法都采用
    &self
    ,因为它们不需要
    &mut self
    self
    授予的权限。我发现添加显式
    *
    并通常等到编译器告诉我添加它时,这种情况相当少见。
    fn plus_one(x: &i32) -> i32 {
        x + 1
    }
    
    fn plus_one_star(x: &i32) -> i32 {
        *x + 1
    }
    
    fn plus_one_mut(x: &mut i32) -> i32 {
        x + 1
    }
    
    fn plus_one_mut_star(x: &mut i32) -> i32 {
        *x + 1
    }
    
    fn main() {
        let a: i32 = 5;
        let mut b: i32 = 5;
    
        println!("{:?}", plus_one(&a));
        println!("{:?}", plus_one_star(&a));
        println!("{:?}", plus_one_mut(&mut b));
        println!("{:?}", plus_one_mut_star(&mut b));
        // I expect all to print '6' as I never actually mutate b
    }