给定此示例
struct Outer<T>(*mut T);
impl<T> Outer<T> {
pub fn new(value: &mut T) -> Outer<T> {
Outer(value as *mut T)
}
}
struct Inner(pub i32);
impl Inner {
pub fn do_thing(&self) {
println!("did the thing {}", self.0);
}
}
fn main() {
let outer = Outer::new(Inner(2));
outer.do_thing() // error: do_thing doesnt exist
}
如何将Inner
的方法公开为Outer
的方法
我正在尝试实现Box
正在做的事情
1条答案
按热度按时间bf1o4zei1#
要实现
Deref
(playground),必须重新借用指针:编辑前的回答如下:
干净的方法是使用返回内部类型的方法:
当内部类型不是
pub
时(您可以只使用self.0
来获得与所有三种方法相同的效果),这会更有用,但这是rust库用户所期望的常见模式。另一种方法是实现
Deref
和DerefMut
,这比较麻烦,因为这是一个非常强大的API承诺:现在你已经将内部类型的所有方法无条件地添加到外部类型中,并且获得了任何未来的方法。这也意味着 Package 器和目标之间的任何名称空间冲突都很难被注意到,这就是为什么像Arc::get_mut
这样的东西是关联函数而不是方法的原因。如果你使用它,考虑将 Package 器上的方法更改为关联函数(不要使用self
参数)。