返回介绍

8.3.5 关联

发布于 2024-10-13 11:25:31 字数 1076 浏览 0 评论 0 收藏 0

定义特征时,可用 关联类型 (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 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。
列表为空,暂无数据
    我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
    原文