Rust 为什么`&;` `需要在迭代过程中分解元组列表吗?
迭代元组列表时,需要使用Rust 为什么`&;` `需要在迭代过程中分解元组列表吗?,rust,Rust,迭代元组列表时,需要使用&。因此,这将起作用 for &(a, b, c) in [("hello", 1.0, 5), ("world", 2.0, 2)].iter() { println!("{} {} {}", a, b, c); } 但那不会 for (a, b, c) in [("hello", 1.0, 5), ("world", 2.0, 2)].iter() { println!("{} {} {}", a, b, c); } // type mis
&
。因此,这将起作用
for &(a, b, c) in [("hello", 1.0, 5), ("world", 2.0, 2)].iter() {
println!("{} {} {}", a, b, c);
}
但那不会
for (a, b, c) in [("hello", 1.0, 5), ("world", 2.0, 2)].iter() {
println!("{} {} {}", a, b, c);
}
// type mismatch resolving `<core::slice::Iter<'_, (&str, _, _)> as core::iter::Iterator>::Item == (_, _, _)`:
// expected &-ptr,
found tuple [E0271]
[你好,1.0,5),(“世界”,2.0,2)]中(a,b,c)的{
println!(“{}{}{}}”,a、b、c);
}
//类型不匹配解析`这是因为返回一个。这就是为什么编译器会说“expected&-ptr,found tuple[E0271]
”
那为什么呢?一般来说,你不能复制t
。除非代码采用了限制性更强的T:Copy
或T:Clone
,否则它只能移动T
类型的值
这对于数组来说是个问题,因为无法将单个元素移出数组;这样做会使整个事情无效
搁置:Vec
和co。通过在unsafe
块中实现附加逻辑来解决此问题,使其正常工作。容器还可以向iter提供,
,这将为您提供一个迭代器,该迭代器增量地使用容器,允许您将值移出
因为您希望数组iter
方法适用于所有数组,所以它会依次生成对每个元素的不可变引用
因此,您试图对&(&str,f32,i32)
进行解构,而不是(&str,f32,i32)
,因此会产生额外的&
。Rust不喜欢隐式,因此必须显式地分解引用。这也有助于明确这里发生了解引用和复制。好的,但是等等:这是否意味着所有元组成员都被复制到各自的插槽a、b和c中?我希望通过元组的引用来访问它们。它们是复制的。事实上,一般来说,如果它们是可复制的,它们就会被复制;如果它们不在引用后面,它们就会被移动;否则,编译器会对你大喊大叫。如果你想要推荐人,你必须要求推荐人。这就是ref
关键字的作用:&(ref a,ref b,ref c)
。这在一个模式中表示:“这个位置的东西?通过引用名为x
”的变量来绑定它。”。是的,你可以在任何模式有效的地方使用它:在匹配臂中,if let
和regularlet
。快乐时光@拜伦:哦!我差点忘了。您还可以(使用最近的rustc
)删除对.iter()
的显式调用。现在有一个特性从一个事物到它的迭代器。由于您是按ref进行迭代,请将[…].iter()
更改为&[…]
(或&mut[…]
的[…].iter\u mut()
)。这也适用于向量v
,&v
和&mut v
分别相当于v.into_iter()
,v.iter()
和v.iter_mut()
。再次感谢对新语法的澄清和更新。好极了!