如何为包含 Rc<Refcell<Trait>> 的结构实现 Deref?
How can I implement Deref for a struct that holds an Rc<Refcell<Trait>>?
我的目标是将针对我的结构的方法调用委托给 Trait 的方法,其中 Trait 对象位于 RefCell
的 Rc
中。
我试着听从这个问题的建议:
我遇到编译错误。
use std::rc::Rc;
use std::cell::RefCell;
use std::fmt::*;
use std::ops::Deref;
pub struct ShyObject {
pub association: Rc<RefCell<dyn Display>>
}
impl Deref for ShyObject {
type Target = dyn Display;
fn deref<'a>(&'a self) -> &(dyn Display + 'static) {
&*self.association.borrow()
}
}
fn main() {}
这里是错误:
error[E0515]: cannot return value referencing temporary value
--> src/main.rs:13:9
|
13 | &*self.association.borrow()
| ^^-------------------------
| | |
| | temporary value created here
| returns a value referencing data owned by the current function
我的示例使用 Display
作为特征;实际上我有一个 Trait 有十几种方法。我试图避免必须实现所有这些方法的样板,并在每次调用中深入研究 Trait 对象。
你不能那样做。 borrow
创建 a new struct 允许 RefCell
跟踪借用。然后不允许 return 借用这个 Ref
,因为它是一个局部变量。
你不能。 RefCell::borrow
returns 一个 Ref<T>
,不是一个 &T
。如果您尝试在方法中执行此操作,则需要先借用 Ref<T>
但它会超出范围。
而不是实施 Deref
,你可以有一个方法 returns 做一些事情:
impl ShyObject {
fn as_deref(&self) -> impl Deref<Target = dyn Display> {
self.association.borrow()
}
}
否则,由于您只想公开内部数据的 Display
实现,因此您可以通过实际取消引用委托的不同类型来解决它:
pub struct ShyObject {
association: Assocation<dyn Display>,
}
struct Assocation<T: ?Sized>(Rc<RefCell<T>>);
impl<T: Display + ?Sized> fmt::Display for Assocation<T> {
fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
write!(f, "{}", self.0.borrow())
}
}
impl Deref for ShyObject {
type Target = dyn Display + 'static;
fn deref(&self) -> &Self::Target {
&self.association
}
}
我的目标是将针对我的结构的方法调用委托给 Trait 的方法,其中 Trait 对象位于 RefCell
的 Rc
中。
我试着听从这个问题的建议:
我遇到编译错误。
use std::rc::Rc;
use std::cell::RefCell;
use std::fmt::*;
use std::ops::Deref;
pub struct ShyObject {
pub association: Rc<RefCell<dyn Display>>
}
impl Deref for ShyObject {
type Target = dyn Display;
fn deref<'a>(&'a self) -> &(dyn Display + 'static) {
&*self.association.borrow()
}
}
fn main() {}
这里是错误:
error[E0515]: cannot return value referencing temporary value
--> src/main.rs:13:9
|
13 | &*self.association.borrow()
| ^^-------------------------
| | |
| | temporary value created here
| returns a value referencing data owned by the current function
我的示例使用 Display
作为特征;实际上我有一个 Trait 有十几种方法。我试图避免必须实现所有这些方法的样板,并在每次调用中深入研究 Trait 对象。
你不能那样做。 borrow
创建 a new struct 允许 RefCell
跟踪借用。然后不允许 return 借用这个 Ref
,因为它是一个局部变量。
你不能。 RefCell::borrow
returns 一个 Ref<T>
,不是一个 &T
。如果您尝试在方法中执行此操作,则需要先借用 Ref<T>
但它会超出范围。
而不是实施 Deref
,你可以有一个方法 returns 做一些事情:
impl ShyObject {
fn as_deref(&self) -> impl Deref<Target = dyn Display> {
self.association.borrow()
}
}
否则,由于您只想公开内部数据的 Display
实现,因此您可以通过实际取消引用委托的不同类型来解决它:
pub struct ShyObject {
association: Assocation<dyn Display>,
}
struct Assocation<T: ?Sized>(Rc<RefCell<T>>);
impl<T: Display + ?Sized> fmt::Display for Assocation<T> {
fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
write!(f, "{}", self.0.borrow())
}
}
impl Deref for ShyObject {
type Target = dyn Display + 'static;
fn deref(&self) -> &Self::Target {
&self.association
}
}