我需要为来自外部包的对象实现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()
不能使用相关功能。
我该如何解决这个问题?重新实现我使用的每个相关函数,只是为了能够实现我需要的一种方法,似乎有点矫枉过正。
答案 0 :(得分:2)
Newtypes专门设计用于提供封装,因此它们不一定能很好地用于添加新内容&#34;。
话虽如此,结合了:
Deref
和DerefMut
可以访问方法From
和Into
可以轻松地从一个转换为另一个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的方法以进行输入。