首页 > 解决方案 > 为什么将所有权转移到一个函数并没有赋予我对该变量的变异权?

问题描述

对不起这个基本问题。我的理解是,范围内的变量有 3 种状态。owned,mutablereadable.

所有者可以将变量作为三个范围中的任何一个提供给另一个范围。可变借用可以将变量提供给另一个作用域,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) {

标签: rust

解决方案


哦,我必须声明函数

fn move_foo(mut foo: String) {
  read_foo(&foo);
  write_foo(&mut foo);
}

fn main() {
  let foo = String::from("Hello");
  move_foo(foo);
}

推荐阅读