添加时对 i32 的不可变和可变引用有什么区别?
What's the difference between immutable and mutable references to an i32 when adding?
我有
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'
为什么这个带有可变引用的函数编译失败?
如错误信息所述:
binary operation + cannot be applied to type '&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
.
我有
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'
为什么这个带有可变引用的函数编译失败?
如错误信息所述:
binary operation + cannot be applied to type '&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
.