为什么将所有权转移到一个函数并没有给我对该变量的突变权?



很抱歉这个基本问题。我的理解是一个变量在一个作用域中有三种状态。owned,mutable,readable.

一个所有者可以给另一个变量的三个范围。可变借用可以将变量作为mutablereadable提供给另一个作用域,只读借用只能将只读借用提供给另一个作用域。

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);
}

相关内容

最新更新