有没有一种方法可以告诉编译器我正在管理循环中变量的所有权



我试图将变量的所有权赋予循环中的函数,我有自己的布尔值以确保它只发生一次,但编译器告诉我在上一次迭代中移动了值。

这里有一个例子:

fn take_ownership(a: String) {
println!("{}", a);
}
fn main() {
let mut a = true;
let hello = "Hello".to_string();
for _ in 0..5 {
if a {
a = false;
take_ownership(hello);
}
}
}

有了这段代码,编译器告诉我:

error[E0382]: use of moved value: `hello`
--> src/main.rs:12:28
|
12 |             take_ownership(hello);
|                            ^^^^^ value moved here in previous iteration of loop

有没有办法告诉编译器"没关系,我会处理的"?我不想使用参考资料(&(。

告诉编译器"没关系,我会处理的"的常用方法是使用unsafe。你可以在这里使用unsafe和一些深层的ptr魔法,但这会非常脆弱,很难证明是正确的。

然而,使用Option:这样做既安全又简单

let mut a = Some("Hello".to_string());
for _ in 0..5 {
if let Some(hello) = a.take() {
take_ownership(hello);
}
}

在原始版本中,ahello之间没有类型级关系,因此编译器不能确定hello只移动了一次。Option将不变量"theremaybe a thing here,or it may be gone"编码到类型中,因此编译器可以知道take_ownership只有在有东西要传递给它时才被调用。

.take()是用None替换a的方法,返回内容(如果有的话(。因为此方法不消耗Option,所以可以在循环中多次调用它。当试图转移所有权时,无法移出借用的内容是一个相关的问题。

相关内容

  • 没有找到相关文章

最新更新