将 mut 引用传递给函数,然后将其返回

Api*_*nix 2 ownership rust borrow-checker

我尝试从一个小时开始编写代码示例,在String. 因此,主函数借用了一个字符串给一个添加空格的函数,然后,我想将字符串返回到主函数中。

fn main() {
    ...
    let mut line = String::new();
    line = make_spaces(5, &mut line);
}

fn make_spaces(number: u8, string: &mut String) -> &mut String {
    for _ in 0..number {
        string.push(' ');
    }
    string
}
Run Code Online (Sandbox Code Playgroud)

但借用检查器给我以下错误:

error[E0308]: mismatched types
  --> src/main.rs:14:12
   |
14 |     line = make_spaces(left_spaces, &mut line);
   |            ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
   |            |
   |            expected struct `String`, found `&mut String`
   |            help: try using a conversion method: `make_spaces(left_spaces, &mut line).to_string()`

Run Code Online (Sandbox Code Playgroud)

我是新手rust,我知道我不懂借钱。但我上网查了一下,还是不太明白。

据我了解,我将line所有权赋予make_spaces函数,然后我(尝试)将所有权交还给string函数main


你能告诉我哪里错了吗?这个问题的解决方案是什么?我知道这是一个常见问题,但我在 stackoverflow 上没有看到任何简单的问题。

Jmb*_*Jmb 9

有两种方法可以完成您正在尝试的操作,但您将两种方法混合在一起:

以可变参数作为参考

fn main() {
    let mut line = String::new();
    make_spaces(5, &mut line);
}

fn make_spaces(number: u8, string: &mut String) {
    for _ in 0..number {
        string.push(' ');
    }
}
Run Code Online (Sandbox Code Playgroud)

在这种情况下,调用者会为您提供对结构的引用,以便您可以就地修改它。无需返回任何东西。

将参数移动到函数中,然后返回修改后的值

fn main() {
    let mut line = String::new();
    line = make_spaces(5, line);
}

fn make_spaces(number: u8, mut string: String) -> String {
    for _ in 0..number {
        string.push(' ');
    }
    string
}
Run Code Online (Sandbox Code Playgroud)

在这种情况下,字符串将被移至函数中make_spaces,因此您需要通过返回将其移回调用方。

  • 假设您真的问字符串数据在返回时是否被复制,答案是否定的:“String”是一个结构体,包含指向堆上字符串数据的指针,该指针确实被复制,但数据本身没有被复制t (顺便说一句,当它作为参数传递时也不会)。 (3认同)
  • 请注意,在 Rust 中,当我们说“某物是复制”时,我们的意思是它实现了 [`Copy`](https://doc.rust-lang.org/std/marker/trait.Copy.html) 特征,而 `String` 则不然。 (2认同)