Rust 为什么我会得到;无法移出借用的内容“;当使用` for&;项目在`?

Rust 为什么我会得到;无法移出借用的内容“;当使用` for&;项目在`?,rust,Rust,我想获取数组中最大的项,其中最大项是在自定义逻辑中定义的 下面是编译的i32版本 fn largest(list: &[i32]) -> i32 { let mut largest = list[0]; for &item in list.iter() { if item > largest { largest = item; } } largest } 这是一个不编译的结构

我想获取数组中最大的项,其中最大项是在自定义逻辑中定义的

下面是编译的
i32
版本

fn largest(list: &[i32]) -> i32 {
    let mut largest = list[0];

    for &item in list.iter() {
        if item > largest {
            largest = item;
        }
    }

    largest
}
这是一个不编译的结构版本

#[derive(Debug, Clone)]
struct Point {
    x: f32,
    y: f32,
}
fn largestPoint(list: &[Point]) -> Point {
    // Defaulting to something
    let mut myPoint: Point = Point { x: 1.0, y: 1.0 };

    for &item in list.iter() {
        if (item.x > myPoint.x) {
            myPoint = item.clone();
        }
    }

    myPoint
}
这个编译器错误是什么意思

错误[E0507]:无法移出借用的内容
-->src/main.rs:11:9
|
11 |对于列表中的项目,iter(){
|         ^----
|         ||
||提示:要防止移动,请使用'ref item'或'ref mut item'`
|无法移出借用的内容
.iter()
是否总是对原始列表的引用?如何在引用中移动项目

for &item in list.iter() {
    if (item.x > myPoint.x) {
        myPoint = item.clone();
    }
}
上面的代码不起作用,因为
for
循环在类型
&Point
的数组中迭代一组对项的引用。当您将其绑定到
&item
时,您正试图分解引用。这与
i32
的列表一起工作,因为
i32
实现了
复制
,从而em可以被复制,但是有了
点的列表
s,它必须移动所有权,这是不可能的

您可以通过如下方式将
&item
更改为
item
来修复代码

for item in list.iter() {
    if (item.x > myPoint.x) {
        myPoint = item.clone();
    }
}

如果还不清楚,请考虑这个例子。

for &(x, y) in [(1, 2), (2, 30)].iter() {
    println!("({}, {})", x, y);
}

还可以看看解构示例。

/.@Shepmaster谢谢你的建议,但我对锈病很陌生,我想在使用Shortcuts之前了解所有权的机制。你为什么选择对&item
使用
而不是对item
使用
?这样做可以解决你的问题。@Shepmaster我目前正在学习ng第10章现在,第一个最大的实现是在中提供的,我只是复制了
i32
的实现,但我知道由于
i32
是原始的,它有
Copy
,我想实现一个结构版本,我实际上不知道作者为什么使用
&item
而不是
item
不相关的建议:如果列表为空,则没有最大点,因此函数不应返回任意值。这里惯用的解决方案是返回一个
选项
。也许您可以建议OP如何使其原始代码工作?这令人困惑,因为如果我不对对象wi使用
&item
Copy
函数将不起作用。它将抱怨
^^^^^预期的i32,发现&i32
如果您从
&item
更改为
item
在第一个示例中,
item
的类型将从
i32
更改为
&i32
。现在,当您比较
item>最大的
时,您正在比较
&i32
i32
,这会给您带来错误。@Jal您需要在循环中写入
*项
,而不是
。这将取消对
&i32
的引用,并生成
i32