在迭代元组列表时,&需要使其工作.这样就行了......
for &(a, b, c) in [("hello", 1.0, 5), ("world", 2.0, 2)].iter() {
println!("{} {} {}", a, b, c);
}
Run Code Online (Sandbox Code Playgroud)
但那不会......
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]
Run Code Online (Sandbox Code Playgroud)
我确信它与我尚未完全内化的解构语法的复杂性有关.
你能解释一下&符背后的句法真相吗?
DK.*_*DK. 10
这是因为iter数组[T]的方法返回一个产生&T值的迭代器.这就是编译器说" expected &-ptr, found tuple [E0271]" 的原因.
那为什么呢?嗯,一般来说,你不能复制T.除非代码假定更具限制性的边界,T: Copy否则T: Clone它只能移动类型的值T.
这是数组的一个问题,因为没有办法将单个元素移出数组; 这样做会使整个事情无效.
旁边:
Vec和合作.通过在unsafe块中实现其他逻辑来使其工作来解决这个问题.容器也可以提供into_iter给你一个迭代器,逐步消耗容器,允许你移出值.
因为您希望数组iter方法适用于所有数组,所以它依次产生对每个元素的不可变引用.
结果,你试图去构造一个&(&str, f32, i32),而不是一个(&str, f32, i32),因此是额外的&.Rust不喜欢隐含性,因此您必须明确地解构引用.这也有助于清楚地说明这里有一个解除引用和副本.