【发布时间】:2020-12-06 12:45:50
【问题描述】:
我有下一个代码,它实现了某种惰性/延迟初始化,为了方便起见,我想使用内部可变性和 Deref 实现。
pub struct Deferred<T> {
value: RefCell<Value<T>>
}
pub enum Value<T> {
Initialized(T),
WaitingForValue
}
impl<T> Deferred<T> {
pub fn init_later() -> Self {
Self { value: RefCell::new(WaitingForValue) }
}
pub fn init(&self, value: T) {
self.value.replace(Initialized(value));
}
}
impl<T> Deref for Deferred<T> {
type Target = T;
fn deref(&self) -> &Self::Target {
if let Initialized(value) = self.value.borrow().deref() {
value
} else {
panic!("Deferred value must be initialized before the first usage")
}
}
}
但我有一个错误:
error[E0515]: cannot return value referencing temporary value
|
30 | if let Initialized(value) = self.value.borrow().deref() {
| ------------------- temporary value created here
31 | value
| ^^^^^ returns a value referencing data owned by the current function
我尝试了不同的引用类型,但无法正常工作。
另外,我尝试过使用 unsafe 来做到这一点:
fn deref(&self) -> &Self::Target {
unsafe {
if let Initialized(value) = &*self.value.as_ptr() {
&value
} else {
panic!("Deferred value must be initialized before the first usage")
}
}
}
它在这种情况下有效,但我不确定这个不安全的代码不会产生未定义的行为。
【问题讨论】:
标签: rust