Pau*_*och 5 rc traits rust refcell
我的目标是将针对我的结构的方法调用委托给 Trait 的方法,其中 Trait 对象位于 ofRc内部RefCell。
我尝试遵循这个问题的建议: How can I acquire an &A reference from a Rc<RefCell<A>>?
我收到编译错误。
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() {}
Run Code Online (Sandbox Code Playgroud)
这是错误:
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() {}
Run Code Online (Sandbox Code Playgroud)
我的例子使用Display作为特征;事实上,我有一个具有十几种方法的特质。我试图避免必须实现所有这些方法的样板,而只是在每次调用中深入研究 Trait 对象。
你不能。RefCell::borrow返回 a Ref<T>,而不是 a &T。如果您尝试在方法中执行此操作,那么您将需要首先借用,Ref<T>但它将超出范围。
Deref您可以使用一个方法来返回执行以下操作的内容,而不是实现:
impl ShyObject {
fn as_deref(&self) -> impl Deref<Target = dyn Display> {
self.association.borrow()
}
}
Run Code Online (Sandbox Code Playgroud)
否则,由于您只想公开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
}
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
2756 次 |
| 最近记录: |