使用`Deref`时如何访问目标的相关功能?

时间:2017-02-03 18:08:12

标签: rust

我需要为来自外部包的对象实现fmt::Display方法,因此我为此对象创建了一个包装器。我希望能够使用原始对象中的所有方法,而无需重新定义所有方法。我试图在令人敬畏的IRC频道Deref上建议#rust-beginners

struct CustomMap(ObjectComingFromAnExternalCrate<char, char>);

impl std::ops::Deref for CustomMap {
    type Target = ObjectComingFromAnExternalCrate<char, char>;

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

fn main() {
    let cm = CustomMap::with_capacity(10);
    println!("Hello, world!");
}

但是,我收到此错误:

error: no associated item named `with_capacity` found for type `CustomMap` in the current scope
  --> <anon>:16:13
   |
16 |     let a = CustomMap::with_capacity(10);
   |             ^^^^^^^^^^^^^^^^^^^^^^^^

我认为这是因为deref()不能使用相关功能。

我该如何解决这个问题?重新实现我使用的每个相关函数,只是为了能够实现我需要的一种方法,似乎有点矫枉过正。

1 个答案:

答案 0 :(得分:2)

Newtypes专门设计用于提供封装,因此它们不一定能很好地用于添加新内容&#34;。

话虽如此,结合了:

  • DerefDerefMut可以访问方法
  • FromInto可以轻松地从一个转换为另一个
  • 或制作内部类型pub

应该能够解决这个问题。

From / Into建议来自这样一个事实,即大多数相关函数通常是构造函数 1

impl From<ObjectComingFromAnExternalCrate<char, char>> for CustomMap { ... }

然后你可以这样做:

let cm: CustomMap = ObjectComingFromAnExternalCrate<char, char>::with_capacity(10).into();

另一个解决方案是将CustomMap定义为:

struct CustomMap(pub ObjectComingFromAnExternalCrate<char, char>);

然后:

let cm = CustomMap(ObjectComingFromAnExternalCrate<char, char>::with_capacity(10));

如果您不希望强制执行任何其他不变量,并且不关心封装,那么应该让您前进。

1 指针类型(例如Rc)会大量使用它们以避免隐藏Deref的方法以进行输入。