此代码在let c = a;编译错误"使用移动值:a"时按预期失败:
fn main() {
let a: &mut i32 = &mut 0;
let b = a;
let c = a;
}
Run Code Online (Sandbox Code Playgroud)
a被移入b并且不再可用于c的赋值.到现在为止还挺好.
但是,如果我只注释其b类型并将其他所有内容留下:
fn main() {
let a: &mut i32 = &mut 0;
let b: &mut i32 = a;
let c = a;
}
Run Code Online (Sandbox Code Playgroud)
代码再次失败 let c = a;
但这一次有一个非常不同的错误信息:"不能搬出去,a因为它是借来的......借来的*a发生在这里:let b: &mut i32 = a;"
所以,如果我只是注释b的类型:没有a进入b,而是一个"重新"的借用*a?
我错过了什么?
干杯.
fn main() {
let mut name = String::from("Charlie");
let x = &mut name;
let y = x; // x has been moved
say_hello(y);
say_hello(y); // but y has not been moved, it is still usable
change_string(y);
change_string(y);
}
fn say_hello(s: &str) {
println!("Hello {}", s);
}
fn change_string(s: &mut String) {
s.push_str(" Brown");
}
Run Code Online (Sandbox Code Playgroud)
当我分配x到y x已被移动。但是,当我在函数中使用它时,我希望可以移动具有移动语义的东西。但是,我仍然可以在后续调用后使用参考。也许这与 say_hello() 接受不可变引用有关,但 change_string() 接受可变引用但引用仍未移动。