文章来源于网络收集而来,版权归原创者所有,如有侵权请及时联系!
8.3.1 同名
特征方法必须实现,即便目标类型已有同名方法。
- 多个特征同名方法,须单独实现。
- 以
Self
、self
引用时,目标类型成员优先。
特征的
.vtable
里没有类型方法。
struct Data; impl Data { fn name(&self) -> &'static str { "M" } } /* ------------------------------------------ */ trait TestTrait { fn name(&self) -> &'static str; } impl TestTrait for Data {} ^^^^^^^^^^^^^^^^^^^^^^^ missing `name` in implementation
可为多个类型实现某个特征,所以编译器要明确知道具体调用目标。
- 以
trait + self
推断。 - 以
trait as type
完全限定。
struct Data; impl Data { fn name(&self) -> &'static str { "M" } } /* ------------------------------------------ */ trait TestTrait { fn hi(&self); fn name(&self) -> &'static str; } impl TestTrait for Data { fn name(&self) -> &'static str { "T" } fn hi(&self) { assert_eq!(self.name(), "M"); assert_eq!((self as &dyn TestTrait).name(), "T"); assert_eq!(TestTrait::name(self), "T"); } } /* ------------------------------------------ */ fn main() { let d = Data; // 默认方法 assert_eq!(d.name(), "M"); // 特征方法 let a: &dyn TestTrait = &d; assert_eq!(a.name(), "T"); // 限定(trait + self) assert_eq!(TestTrait::name(&d), "T"); // 完全限定 assert_eq!(<Data as TestTrait>::name(&d), "T"); d.hi(); }
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论