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奇怪的是,
在所有情况下都有效。。。在这种情况下,可能会出现强迫?@PaoloFalabella我不确定强迫何时是正确的术语;但是,是的,我认为这是起作用的。所以在这个例子中,x.add(1)
的行为就像&T
一样。一般来说,我应该在使用不可变引用之前取消引用它们吗?或者,对于T
,实现大多数&T
方法是非常普遍的吗?@turbulence我也不确定我是否明白你的意思。如果您有一个值,则可以调用该类型的方法,这些方法不带任何仪式地接受T
或&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 }