【问题标题】:Converting a immutable variable to mutable by taking ownership通过获取所有权将不可变变量转换为可变变量
【发布时间】:2020-11-04 00:24:16
【问题描述】:

我正在通过官方 rust 网站上的the Rust book 并遇到following paragraph

请注意,我们需要使v1_iter 可变:在迭代器上调用 next 方法会更改迭代器用来跟踪它在序列中的位置的内部状态。换句话说,此代码消耗或用完迭代器。每次调用 next 都会消耗迭代器中的一个项目。 当我们使用 for 循环时,我们不需要使 v1_iter 可变,因为循环获取了 v1_iter 的所有权并使其在幕后可变。

如果你注意到最后一行。它说 for 循环使可变变量在幕后不可变。如果可以,那么作为程序员的我们是否也可以这样做?

就像我知道这不安全,我们不应该那样做,只是想知道这是否可能。

【问题讨论】:

  • 这句话并没有说,一个不可变的变量变成了一个可变的变量。它表示对象的所有权已转移。接收者是此后的唯一所有者,并且可以随心所欲地做任何事情。发生的事情类似于this
  • 好的,谢谢。我明白了。

标签: for-loop rust ownership


【解决方案1】:

将不可变变量重新绑定到可变变量是完全可以的,例如以下代码有效:

let x = 5;
let mut x = x;

在最后一条语句之后,我们可以改变 x 变量。其实想一想,有两个变数,第一个是搬家到最新的。函数也可以这样做:

fn f(mut x: i32) {
    x += 1;
}

let y = 5;
f(y);

Rust 中禁止的事情是将不可变引用更改为可变引用。这是一个重要的区别,因为与借来的相比,拥有的价值总是可以安全地改变。

【讨论】:

  • 虽然let mut x = x; 不是很常见,但mut 参数更常见,let x = x; 也是pretty common
  • 我相信let mut x = x 以函数参数的形式相当普遍,例如fn f(mut self) { .. }.
猜你喜欢
  • 2018-04-10
  • 1970-01-01
  • 1970-01-01
  • 2020-12-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-04-12
  • 1970-01-01
相关资源
最近更新 更多