【问题标题】:Immutable reference to data in RefCell对 RefCell 中数据的不可变引用
【发布时间】:2021-03-05 14:36:41
【问题描述】:

我正在尝试为具有内部可变性的结构实现 Index 方法:

pub struct FooVec {
    foo: RefCell<Vec<i32>>
}

impl Index<usize> for FooVec {
    type Output = i32;

    fn index(&self, index: usize) -> &Self::Output {
        self.foo.borrow().index(index)
    }
}

但是,由于以下原因无法编译:

error[E0515]: cannot return value referencing temporary value
 --> src\lacc\expr.rs:9:9
  |
9 |         self.foo.borrow().index(index)
  |         -----------------^^^^^^^^^^^^^
  |         |
  |         returns a value referencing data owned by the current function
  |         temporary value created here

我的解决方案是在 RefCell 中返回向量的引用。但我找到的唯一方法 这是 get_mut() 并且对于 Index trait 我需要返回一个不可变的引用...

如果有任何关于如何处理这个问题的建议,我将不胜感激。

【问题讨论】:

    标签: vector indexing rust immutability refcell


    【解决方案1】:

    你不能实现IndexIndex trait 需要返回一个引用,这意味着它必须返回一个附加到对象并且很容易可以从对象访问的东西。 p>

    这里不是这种情况,因为您需要通过 RefCell::borrow,它的功能基本上就像是从头开始创建一个值(因为它只通过 a Ref "lock guard" 分发访问权限)。

    如果有任何关于如何处理这个问题的建议,我将不胜感激。

    做点别的。 Index 不是一个选项。考虑到所涉及的类型,我建议只实现一个返回 Option&lt;i32&gt;get 方法,类似这些。

    【讨论】:

    • 谢谢,我害怕那个。我不明白为什么 RefCell 实现 get_mut() 而不是 get() ..
    • @Adam 因为这不能支持 Rust 的别名保证:get_mut() 需要一个可变引用,所以我们静态地知道只有一个对 RefCell 的引用并且没有人有任何办法获得另一个引用同时通过borrowborrow_mut。然而,由于get() 只需要一个不可变引用,我们可以同时调用borrow_mut(),而RefCell 将无法知道存在未完成的引用,因此我们将同时拥有一个可变引用和一个非零个不可变引用,这是绝对禁止的。
    • 另外你可能想看看 owning-ref,它使用起来相当复杂,但重点是将引用和它们的所有者放在一起,这样可能对你有用。
    猜你喜欢
    • 2014-07-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-12-08
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多