【问题标题】:How to create a Rc<RefCell<>> of a self mutable reference?如何创建一个自可变引用的 Rc<RefCell<>>?
【发布时间】:2020-05-25 21:32:30
【问题描述】:

我正在为VirtualTapInterface 实现一个特征。该特征的receive 函数应该创建一个TxToken 结构,其中lower 属性必须是包含当前VirtualTapInterfaceRc&lt;RefCell&lt;VirtualTapInterface&gt;&gt;,即self

impl<'a> Device<'a> for VirtualTapInterface {
    type TxToken = TxToken;

    fn receive(&'a mut self) -> Option<(Self::RxToken, Self::TxToken)> {
                let tx = TxToken { lower: Rc::new(RefCell::new(*self))};

我试过了,但我明白了

无法移出位于可变引用后面的*self

发生移动是因为 *self 具有类型 phy::virtual_tun::VirtualTapInterface,它没有实现 Copytraitrustc(E0507)

如何创建一个自可变引用的Rc&lt;RefCell&lt;&gt;&gt;

【问题讨论】:

标签: rust


【解决方案1】:

我认为您需要将签名更改为fn receive(self) -&gt; ... 才能获得所有权。克隆或拿走一个盒子也可以。

另一种选择是使用mem::takemem::replacemem::swap

【讨论】:

  • 我无法更改签名,它们来自 Trait。克隆是什么意思?从何而来?
  • 使用self.clone() 代替*self(如果可能的话)。
  • 克隆会创建一个副本,对吗?我需要引用同一个对象,所以不能选择克隆。
  • @GuerlandoOCs 是的。 mem::* 函数之一会起作用吗?不能将Rc&lt;RefCell&lt;_&gt;&gt; 指向无主对象。
  • @GuerlandoOCs 为了能够使用Rc&lt;RefCell&lt;_&gt;&gt;,您需要拥有所有权,这意味着您需要通过使用mem::* 函数之一或克隆对象来获得所有权,或者您需要已经拥有所有权,采用 selfself: Box&lt;Self&gt; 而不是 &amp;mut self
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-04-06
  • 1970-01-01
  • 2019-12-13
  • 1970-01-01
  • 2020-06-14
  • 2023-01-20
相关资源
最近更新 更多