Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/rust/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Rust 为什么`&;` `需要在迭代过程中分解元组列表吗?_Rust - Fatal编程技术网

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
和regular
let
。快乐时光@拜伦:哦!我差点忘了。您还可以(使用最近的
rustc
)删除对
.iter()
的显式调用。现在有一个特性从一个事物到它的迭代器。由于您是按ref进行迭代,请将
[…].iter()
更改为
&[…]
(或
&mut[…]
[…].iter\u mut()
)。这也适用于向量
v
&v
&mut v
分别相当于
v.into_iter()
v.iter()
v.iter_mut()
。再次感谢对新语法的澄清和更新。好极了!