如何解决 Rustlings 练习“move_semantics3.rs”?

Sik*_*Yao 1 rust

我正在做Rustlings练习,有一个练习“move_semantics3.rs”:

// move_semantics3.rs
// Make me compile without adding new lines-- just changing existing lines!
// (no lines with multiple semicolons necessary!)
// Scroll down for hints :)

pub fn main() {
    let vec0 = Vec::new();

    let mut vec1 = fill_vec(vec0);

    println!("{} has length {} content `{:?}`", "vec1", vec1.len(), vec1);

    vec1.push(88);

    println!("{} has length {} content `{:?}`", "vec1", vec1.len(), vec1);

}

fn fill_vec(vec: Vec<i32>) -> Vec<i32> {
    vec.push(22);
    vec.push(44);
    vec.push(66);

    vec
}
Run Code Online (Sandbox Code Playgroud)

提示说:

这个和上一个的区别在于fn fill_vec,had的第一行已经let mut vec = vec;不存在了。您可以,而不是添加该行,mut在一个地方添加,将现有绑定更改为可变绑定而不是不可变绑定:)

我不知道如何通过仅添加一个mut.

Fre*_*ios 8

如果您将代码复制/粘贴到操场上,编译器会抱怨:

error[E0596]: cannot borrow immutable argument `vec` as mutable
  --> src/main.rs:20:5
   |
19 | fn fill_vec(vec: Vec<i32>) -> Vec<i32> {
   |             --- consider changing this to `mut vec`
20 |     vec.push(22);
   |     ^^^ cannot borrow mutably
Run Code Online (Sandbox Code Playgroud)

编译器说明了一切:您必须替换为vecmut vec因为默认情况下 Rust 变量是不可变的。

  • @SikaiYao 请不要在评论中添加“谢谢”。[Upvoting](https://stackoverflow.com/help/privileges/vote-up) 并接受答案是 Stack Overflow 表达感谢的方式。请参阅[当有人回答我的问题时我该怎么办?](https://stackoverflow.com/help/someone-answers) (2认同)
  • 作为一个初学者,我认为这很棘手。原始 vec0 是不可变的。当调用 fill_vec() 时,我们借用 vec0 作为可变的。我认为这意味着在堆栈上创建了一个浅副本并且该副本是可变的。原来的vec0已经失去了绑定,看不到任何变化。我对么?这是一个人为的示例还是您可能在实际代码中看到的内容? (2认同)