很抱歉这个基本问题。我的理解是一个变量在一个作用域中有三种状态。owned
,mutable
,readable
.
一个所有者可以给另一个变量的三个范围。可变借用可以将变量作为mutable
或readable
提供给另一个作用域,只读借用只能将只读借用提供给另一个作用域。
fn write_foo(foo: &mut String) {
foo.push_str("bar");
read_foo(foo);
}
fn read_foo(foo: &String) {
print!("{}.", foo);
}
fn main() {
let mut foo = String::from("Hello");
read_foo(&foo);
write_foo(&mut foo);
}
但是如果我要添加另一个函数来获取foo
的所有权,并且做与main
最初做的相同的事情,编译器不喜欢它。
fn move_foo(foo: String) {
read_foo(&foo);
write_foo(&mut foo);
}
fn main() {
let mut foo = String::from("Hello");
move_foo(foo);
}
我知道我可以只是给出一个可变的借用,但为什么我可以在回调范围内使用move
,而不是将变量移动到一个单独的函数?
fn move_foo(mut foo: String) {
我必须声明函数
fn move_foo(mut foo: String) {
read_foo(&foo);
write_foo(&mut foo);
}
fn main() {
let foo = String::from("Hello");
move_foo(foo);
}