泛型

如果你要使用一个禀赋的方法, 那么你需要将该禀赋引入当前的作用域中.

完全限定语法

类型或禀赋::方法名

<类型 as 实现的某个禀赋>::那个禀赋的方法名

同名方法调用顺序

对于对象.方法名(参数):

  1. 编译器检查它是否可以直接调用 类型名::方法名(对象接收器, 参数), 称之为值方法调用.
    1. 如果 类型名 里直接有方法名的定义, 则调用类型名::方法名(对象接收器, 参数).
    2. 如果 类型名 实现了 禀赋名. 恰好 禀赋名 里有 方法名 的定义, 则调用 <类型名 as 禀赋名>::方法名(对象接收器, 参数),
  2. 如果第一步失败,那么编译器会尝试增加自动引用,例如会尝试以下调用: <&类型名>::方法名(对象接收器, 参数)<&mut 类型名>::方法名(参数), 称之为引用方法调用.
  3. 如果第二步失败,编译器会试着解引用 类型名 , 然后再进行尝试. 若 类型名: Deref<Target = 目标类型名>, 那么编译器会使用 目标类型名 类型从第一步开始继续尝试, 称之为解引用方法调用.
  4. 若第三步仍未找到可调用的 方法名 , 且 类型名 是一个定长类型 (在编译器类型长度是已知的), 那么编译器也会尝试将 类型名 从定长类型转为不定长类型重复第一步,例如将 [i32; 2] 转为 [i32].
  5. 如果第四步依然找不到可调用的 方法名 , 编译器罢工报错.

对象接收器可以为空,因此以上过程可以找到关联函数

对于禀赋名::方法名(对象接收器, 参数): 会根据对象接收器的类型选择 禀赋名 里合适的 方法名 实现。此法下 对象接收器 必须存在。如果想要调用 禀赋名 的关联函数, 必须要使用完全限定语法.

禀赋约束

在禀赋定义中也可以使用禀赋约束. 规定实现一个禀赋前需要先实现别的一些禀赋.

简写

impl 禀赋甲 + 禀赋乙: 静态限定该类型必须具有 禀赋甲禀赋乙.

全写

<类型: 禀赋甲 + 禀赋乙>: 该泛型只能匹配具备禀赋甲和禀赋乙的类型.

禀赋对象

动态大小类型 (DST).

某禀赋的所有方法都有如下属性时,它的对象才是安全的:

  • 方法的返回类型不能是 Self.
  • 方法没有任何泛型参数.

只有对象安全的禀赋才能用来创造禀赋对象.

dyn 禀赋甲 + 禀赋乙: 动态限定这些类型必须都实现了禀赋甲和禀赋乙.

模块

使用 pub(in 路径) 可以使对象在路径下可见.

几个特殊的路径:

  • self: 本模块.
  • crate: 本编译单元 (crate).
  • super: 父模块.