将 mut 引用传递给函数,并将其取回

问题描述

我从一个小时开始就尝试编写代码示例,他在 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
}

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

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()`


我是 rust 的新手,我知道我不懂借用。但是我在网上搜了下,还是没看懂。

据我所知,我将 line 所有权赋予 make_spaces 函数,然后我(尝试)将 string 的所有权归还给 main 函数


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

解决方法

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

以可变参数为参考

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

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

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

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
}

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

,

您不必返回任何内容:您收到了对函数调用者已经拥有的结构体的引用。

就去做

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

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