У меня естьВ чем разница между неизменяемыми и изменяемыми ссылками на i32 при добавлении?
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'
Почему эта функция с изменяемой ссылкой не компилировать?
Странная вещь, что 'x.add (1)' работает во всех случаях, хотя ... В этом случае возможно принуждение? –
@PaoloFalabella Я не уверен, когда * принуждение * - правильный термин; но да, я предполагаю, что [автоматическое разыменование] (http://stackoverflow.com/q/28519997/155423) вступает в игру там. – Shepmaster
Итак, в этом случае '& T' ведет себя точно так же, как' T'. В целом, хотя я должен разыгрывать все свои неизменные ссылки, прежде чем использовать их? Или это чрезвычайно распространено для реализации большинства методов 'T' для '& T'? – turbulencetoo