rust - 为什么将所有权转移到一个函数并没有赋予我对该变量的变异权?
问题描述
对不起这个基本问题。我的理解是,范围内的变量有 3 种状态。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);
}