文章来源于网络收集而来,版权归原创者所有,如有侵权请及时联系!
8.3.5 关联
定义特征时,可用 关联类型 (associated type)设定延迟类型。因此,也被称作类型占位符。
use std::default::Default; trait TestTrait { type A: Default; // <----- 用别名和约束,先用起来。 fn get_default(&self) -> Self::A { Default::default() } } impl TestTrait for i32 { type A = i32; // <----- 把别名补上。 } fn main() { assert_eq!(1.get_default(), 0); }
作为参数时,须指定关联类型。
fn test(x: &dyn TestTrait<A = i32>) { // 光有别名是不完整的。 assert_eq!(x.get_default(), 0); } fn main() { test(&1); }
关联类型 和 泛型 都可以为特征提供额外的 延迟类型 用于装配。
两者最大区别在于,单个泛型特征可用不同类型参数为目标实现多次,而关联类型不行。
泛型是模版,与类型参数结合后生成多个具体实例。
关联类型的延迟字段是内部状态,不影响其外在类型。
impl TestTrait<i32> for Data // 泛型特征 + 类型参数 -> 多个实例。 impl TestTrait<f32> for Data
impl TestTrait for Data { ---------------------- first implementation here type A = i32; } impl TestTrait for Data { ^^^^^^^^^^^^^^^^^^^^^^^ conflicting implementation type A = f32; }
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论