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
。