为Cell中保存的目标类型实现Deref

时间:2017-04-10 22:25:39

标签: rust

我有一个我在Deref上实现的结构:

pub struct Foo {
    val: u8,
}

impl Deref for Foo {
    type Target = u8;

    fn deref(&self) -> &u8 {
        &self.val
    }
}

我想在内部更改结构,以便将值保存在Cell

pub struct Foo {
    val: Cell<u8>,
}

我天真地实施了Deref,如下所示:

impl Deref for Foo {
    type Target = u8;

    fn deref(&self) -> &u8 {
        &self.val.get()
    }
}

编译器抱怨说&self.val.get() does not live long enough,其中 主要对我有意义(Cell不是Copy类型?),但我不知道如何让它编译。我曾尝试过终身注释,但我所做的并不是直觉上正确的,而且我现在只是盲目地改变一些东西。

1 个答案:

答案 0 :(得分:4)

Cell允许内部可变性永远不允许您获取内部值的不可变引用。 get会返回值的副本,get_mut仅在您有一个可变引用开头时才有效。

由于您只能得到一个值,并且no way to return a reference to a local value,因此无法为此类型实现Deref

如果您认为可以使用RefCell“欺骗”编译器,则不能,但您可以包装它生成的Ref类型: