【问题标题】:Why I cannot borrow something I borrowed and why I can move a method's self?为什么我不能借我借的东西,为什么我可以移动一个方法的自我?
【发布时间】: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


【解决方案1】:

我在这里没有看到问题,因为我可以等待self.should_continue.into_inner() 使用借来的值,这样我就可以返回借来的值。为什么我借的东西不能借?

这不是正在发生的事情。查看into_inner() 的文档,它需要一个self 参数,这意味着它移动了AtomicBool。但是,您不能从共享引用 &C 中移动 should_continue,因为这会使它处于无效状态。

但是,我该如何移动自己?移动是不返回对象的东西。我正在将对象移动到这个函数的内部,它不应该再存在于其他地方了。

从所有权的角度考虑搬家。调用c.a() 将值的所有权从变量c 转移到参数self。该值仍然存在,只是使用了一个新名称。

【讨论】:

    猜你喜欢
    • 2015-08-05
    • 2019-12-30
    • 2017-10-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多