gpt4 book ai didi

rust - 使用 `Deref` 时如何访问目标的关联函数?

转载 作者:行者123 更新时间:2023-11-29 08:07:51 25 4
gpt4 key购买 nike

我需要为来自外部 crate 的对象实现 fmt::Display 方法,因此我为该对象创建了一个包装器。我希望能够使用原始对象的所有方法,而不必重新定义所有方法。我尝试按照很棒的 IRC channel #rust-beginners 上的建议实现 Deref:

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() 不能与相关函数一起使用。

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

最佳答案

Newtypes 是专门为提供封装而设计的,因此它们不一定适合“添加新内容”。

话虽这么说,但结合了:

  • 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 类型的方法。

关于rust - 使用 `Deref` 时如何访问目标的关联函数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42030429/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com