【发布时间】:2020-09-26 05:54:50
【问题描述】:
我正在努力解决这个简单的例子:
use std::sync::atomic::{AtomicBool, Ordering};
pub struct C {
should_continue: AtomicBool
}
impl C {
fn a(self) -> bool{
self.should_continue.into_inner()
}
// fails
fn b(&self) -> bool{
self.should_continue.into_inner()
}
}
fn main() {
let c = C {
should_continue: AtomicBool::new(false),
};
}
我认为上面的方法都翻译成这种伪语言了:
fn a(c: C) -> bool {
// ...
}
fn b(c: &C) -> bool {
// ...
}
所以c.a() 应该是a(c) 而c.b() 应该是b(&c)。我认为在 Rust 中,c.a() 或 a(c) 只是在移动。而c.b() 或b(&c) 正在借用。
我认为fn b(&self) -> bool 中的错误是因为我试图向某人借我为自己借的东西。我在这里没有看到问题,因为我可以等待self.should_continue.into_inner() 使用借来的值,这样我就可以返回借来的值。为什么我借的东西不能借?
现在,对于fn a(self) -> bool,不给出错误是有道理的,因为它移动了值,所以我可以自己借用它。但是,我怎样才能移动self?移动是不返回对象的东西。我正在将对象移动到这个函数的内部,它不应该再存在于其他地方了。
【问题讨论】:
-
fn x(self)有效地消耗self如果你想这样想的话。许多函数都是故意这样设置的,以防止在调用该函数后使用self,该对象已损坏或以某种方式无法使用。 -
@tadman 嗯嗯,刚刚在这里测试过。所以我是对的,
fn a(self)使对象无法使用。但是为什么我不能借我借的东西呢? -
你可以借一个借用,但如果你在归还之前不停止使用那个借用,你最终会受到终身影响。我认为这里真正的问题是
into_inner占有,这与您简单借贷的意图相矛盾。借用检查器将此标记为问题。
标签: rust