【问题标题】:How do I solve the Rustlings exercise "move_semantics3.rs"?如何解决 Rustlings 练习“move_semantics3.rs”?
【发布时间】:2018-05-22 12:24:45
【问题描述】:

我正在做Rustlings exercises 并且有一个练习“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
}

提示说:

这个和之前的区别在于 具有let mut vec = vec;fn fill_vec 的第一行不再是 那里。您可以在其中添加 mut 而不是添加该行 将现有绑定更改为可变绑定的地方 而不是一个不可变的:)

我不知道如何通过仅添加一个 mut 来更正此代码。

【问题讨论】:

  • 练习的 README 的前两句是(强调我的): 让你习惯阅读和编写 Rust 代码的小练习。 包括练习阅读和响应编译器消息!
  • 只需将 fn fill_vec(vec: Vec&lt;i32&gt;) -&gt; Vec&lt;i32&gt; { 更改为 fn fill_vec(mut vec: Vec&lt;i32&gt;) -&gt; Vec&lt;i32&gt; { ,因为可变性可以在移动中改变。

标签: rust


【解决方案1】:

如果您将代码复制/粘贴到 Playground 中,编译器会报错:

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

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

【讨论】:

  • @SikaiYao 请不要将“谢谢”添加为cmets。 Upvoting 并接受答案是 Stack Overflow 表达谢谢的方式。见What should I do when someone answers my question?
  • 作为一个初学者,我认为这很棘手。原始的 vec0 是不可变的。当调用 fill_vec() 时,我们将 vec0 借用为可变的。我认为这意味着在堆栈上进行了浅拷贝,并且拷贝是可变的。原来的 vec0 已经失去了绑定,看不到任何变化。我对么?这是一个人为的例子还是你可能在实际代码中看到的?
  • @user1879313 这部分 Rust 很棘手。 mutable 和 immutable REFERENCES 之间的区别具有真正的语义含义。引用还意味着内存中的特定内容(不复制数据)。在不涉及引用的情况下,缺少mut 只是一种方便的方式来更改数据,而不是意外更改数据。它不是数据的固有属性。此外,(缺少)mut 并没有说明内存中发生的事情。
猜你喜欢
  • 2020-07-01
  • 2019-06-23
  • 1970-01-01
  • 2021-12-23
  • 2011-01-22
  • 2021-03-10
  • 1970-01-01
  • 1970-01-01
  • 2014-03-14
相关资源
最近更新 更多