rust 如何将内部对象的函数“实现”到外部结构体上?

swvgeqrz  于 2023-02-23  发布在  其他
关注(0)|答案(1)|浏览(137)

给定此示例

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正在做的事情

bf1o4zei

bf1o4zei1#

要实现Deref(playground),必须重新借用指针:

impl<T: ?Sized> Deref for Outer<T> {
    type Target = T;

    fn deref(&self) -> &Self::Target {
        unsafe { &*self.0 }
    }
}

编辑前的回答如下:
干净的方法是使用返回内部类型的方法:

impl<T> Outer<T> {
    pub fn get(&self) -> &T {
        &self.0
    }
    pub fn get_mut(&mut self) -> &mut T {
        &mut self.0
    }
    pub fn into_inner(self) -> T {
        self.0
    }
}

当内部类型不是pub时(您可以只使用self.0来获得与所有三种方法相同的效果),这会更有用,但这是rust库用户所期望的常见模式。
另一种方法是实现DerefDerefMut,这比较麻烦,因为这是一个非常强大的API承诺:现在你已经将内部类型的所有方法无条件地添加到外部类型中,并且获得了任何未来的方法。这也意味着 Package 器和目标之间的任何名称空间冲突都很难被注意到,这就是为什么像Arc::get_mut这样的东西是关联函数而不是方法的原因。如果你使用它,考虑将 Package 器上的方法更改为关联函数(不要使用self参数)。

impl<T> Deref for Outer<T> {
    type Target = T;

    fn deref(&self) -> &Self::Target {
        &self.0
    }
}

相关问题