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

时间:2017-01-22 18:14:03

标签: rust mutable

我有

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
}

第三个函数plus_one_mut无法使用:error[E0369]: binary operation `+` cannot be applied to type '&mut i32'

进行编译

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

1 个答案:

答案 0 :(得分:4)

正如错误消息所示:

  

二元操作+无法应用于'& mut i32'

那是因为它没有实现。查看the documentation for i32,您会看到Add的这些实现:

  • impl Add<i32> for i32
  • impl<'a> Add<i32> for &'a i32
  • impl<'a> Add<&'a i32> for i32
  • impl<'a, 'b> Add<&'a i32> for &'b i32

您需要取消引用&mut i32才能转到i32,其实施Add

为什么没有这个实现?我不确定。也许你可以向Rust提交PR来添加它......就个人而言,我无法回想起曾经需要它。通常,如果您有&mut T因为想要更新它,那么您将拥有类似*foo += 1的内容。