gpt4 book ai didi

rust - 为什么 for 循环绑定(bind)上的 `ref mut` 与被循环变量上的 `&mut` 不同?

转载 作者:行者123 更新时间:2023-11-29 08:24:40 27 4
gpt4 key购买 nike

Rust by Example ,它说:

A ref borrow on the left side of an assignment is equivalent to an & borrow on the right side.

我认为这两个 for 循环是等效的:

编译成功:

let mut v2 = vec![1, 2, 3];
for i in &mut v2 {
*i = *i + 1;
}
println!("{:?}", v2);

无法编译:

let mut v1 = vec![1, 2, 3];
for ref mut i in v1 {
*i = *i + 1;
}
println!("{:?}", v1);

似乎v已移动:

error[E0382]: use of moved value: `v1`
--> src/main.rs:6:22
|
3 | for ref mut i in v1 {
| -- value moved here
...
6 | println!("{:?}", v1);
| ^^ value used here after move
|
= note: move occurs because `v1` has type `std::vec::Vec<i32>`, which does not implement the `Copy` trait

最佳答案

您从书中引用的内容是正常作业的规则,例如 let 的作业。 。例如:

let x = &42;
let ref x = 42;

但是名称绑定(bind)在for中循环有点不同:

  • 要循环的值被转换为迭代器( <v1 as IntoIterator>::into_iter() )让我们调用该结果 it .
  • 然后是it.next()被重复调用:
    • 如果返回 Some(_)那么它的值就会绑定(bind)到你的变量上。就像你写 let Some(ref mut i) = it.next() 一样或let Some(mut i) = it.next() 。这里是 ref很重要。
    • 如果返回 None循环结束。

所以在 for循环情况,ref&不等价。

当您使用&时在循环的右侧,它不会直接更改变量的绑定(bind);您只需更改迭代对象的类型即可。然后,一切都归结为 IntoIterator 的实现对于 Vec<_>&Vec<_> 相比.

  • 如果你迭代Vec<T> ,它获取向量的所有权,并且迭代返回值本身。所以for i in v1消耗向量和 i具有所包含值的类型 T .
  • 如果你迭代&Vec<T> ,它借用向量并且迭代返回指向所包含值的指针 &T ,所以在 for i in &v1 i的类型实际上是一个指向值的指针。使用 for i in v1.iter() 可以获得相同的效果.
  • 如果你迭代&mut Vec<T> ,与前一个类似,但可变,因此迭代返回 &mut T 类型的值.

结论是使用reffor循环可能没那么有用。

关于rust - 为什么 for 循环绑定(bind)上的 `ref mut` 与被循环变量上的 `&mut` 不同?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53631539/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com