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 for循环的元素变量中的引用_Rust - Fatal编程技术网

Rust for循环的元素变量中的引用

Rust for循环的元素变量中的引用,rust,Rust,我很难理解为什么这段来自works的片段: fn最大(arr:&[i32])->i32{ 设mut max=arr[0]; 国际热核聚变实验堆(){ 如果我>最大值{ max=i; } } 最大值 } 假设A:使用arr.iter()在数组/切片/向量上迭代时,将返回对该数组/切片/向量中项目的引用。因此,i将属于&i32类型。在定义中添加额外的&将使其成为引用,因此&&i32 假设B:特征(在第2行中使用)将返回索引项的可变引用,因此在本例中,a&mut i32 这两种假设都是错误的,因为i

我很难理解为什么这段来自works的片段:

fn最大(arr:&[i32])->i32{
设mut max=arr[0];
国际热核聚变实验堆(){
如果我>最大值{
max=i;
}
}
最大值
}
假设A:使用
arr.iter()
在数组/切片/向量上迭代时,将返回对该数组/切片/向量中项目的引用。因此,
i
将属于
&i32
类型。在定义中添加额外的
&
将使其成为引用,因此
&&i32

假设B:特征(在第2行中使用)将返回索引项的可变引用,因此在本例中,a
&mut i32

这两种假设都是错误的,因为
i
max
都属于
i32
类型。为什么?


另外,我知道,
i32
实现了
Copy
-特性,但是由于我没有将所有权转移到代码中的任何地方(因为所有内容都是引用),所以不应该在这里使用它,对吗


最后,如果我离开
.iter()
-调用,它也可以工作。我假设编译器根据
&I
-定义推断应该使用
iter()
(而不是
iter\u mut()
into\u iter()
),对吗

for &i in arr.iter() {
您没有添加
&
:这是。您正在将
&i
与迭代结果进行匹配,从而删除
&

这就像做一件事一样有效

for i in arr.iter() {
    let i = *i;

我不明白你的意思,拷贝不应该被使用。例如,当您返回值时使用它。@DenysSéguret暂时忽略最终返回值,是否在其他地方使用它?您可以根据假设B展开吗?
max
属于
i32
,而不是
&i32
是的,但为什么?如前所述,应该使用IndexMut trait,表示它将返回
&muti32
。为什么是
i32
?如果索引是赋值的左侧,而不是右侧,或者使用max=&mut arr[0],则将使用IndexMut。它还需要数组是可变的。这里使用的特征是非常有趣的,我没有意识到任务的那一面是相关的!但是这难道不意味着
arr[0]
返回一个
&i32
(正如索引特征定义的那样)?