我有一个我在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
类型?),但我不知道如何让它编译。我曾尝试过终身注释,但我所做的并不是直觉上正确的,而且我现在只是盲目地改变一些东西。
答案 0 :(得分:4)
Cell
允许内部可变性永远不允许您获取内部值的不可变引用。 get
会返回值的副本,get_mut
仅在您有一个可变引用开头时才有效。
由于您只能得到一个值,并且no way to return a reference to a local value,因此无法为此类型实现Deref
。
如果您认为可以使用RefCell
“欺骗”编译器,则不能,但您可以包装它生成的Ref
类型: