Rust 面向对象与模块化
泛型
如果你要使用一个禀赋的方法, 那么你需要将该禀赋引入当前的作用域中.
完全限定语法
类型或禀赋::方法名
<类型 as 实现的某个禀赋>::那个禀赋的方法名
同名方法调用顺序
对于对象.方法名(参数)
:
- 编译器检查它是否可以直接调用
类型名::方法名(对象接收器, 参数)
, 称之为值方法调用.- 如果 类型名 里直接有方法名的定义,
则调用
类型名::方法名(对象接收器, 参数)
. - 如果 类型名 实现了 禀赋名. 恰好 禀赋名
里有 方法名 的定义,
则调用
<类型名 as 禀赋名>::方法名(对象接收器, 参数)
,
- 如果 类型名 里直接有方法名的定义,
则调用
- 如果第一步失败,那么编译器会尝试增加自动引用,例如会尝试以下调用:
<&类型名>::方法名(对象接收器, 参数)
和<&mut 类型名>::方法名(参数)
, 称之为引用方法调用. - 如果第二步失败,编译器会试着解引用 类型名 , 然后再进行尝试.
若
类型名: Deref<Target = 目标类型名>
, 那么编译器会使用 目标类型名 类型从第一步开始继续尝试, 称之为解引用方法调用. - 若第三步仍未找到可调用的 方法名 , 且 类型名
是一个定长类型 (在编译器类型长度是已知的), 那么编译器也会尝试将
类型名 从定长类型转为不定长类型重复第一步,例如将
[i32; 2]
转为[i32]
. - 如果第四步依然找不到可调用的 方法名 , 编译器罢工报错.
对象接收器可以为空,因此以上过程可以找到关联函数
对于禀赋名::方法名(对象接收器, 参数)
:
会根据对象接收器的类型选择 禀赋名 里合适的
方法名 实现。此法下 对象接收器
必须存在。如果想要调用 禀赋名 的关联函数,
必须要使用完全限定语法.
禀赋约束
在禀赋定义中也可以使用禀赋约束. 规定实现一个禀赋前需要先实现别的一些禀赋.
简写
impl 禀赋甲 + 禀赋乙
: 静态限定该类型必须具有
禀赋甲 和 禀赋乙.
全写
<类型: 禀赋甲 + 禀赋乙>
:
该泛型只能匹配具备禀赋甲和禀赋乙的类型.
禀赋对象
动态大小类型 (DST).
某禀赋的所有方法都有如下属性时,它的对象才是安全的:
- 方法的返回类型不能是 Self.
- 方法没有任何泛型参数.
只有对象安全的禀赋才能用来创造禀赋对象.
dyn 禀赋甲 + 禀赋乙
:
动态限定这些类型必须都实现了禀赋甲和禀赋乙.
模块
使用 pub(in 路径)
可以使对象在路径下可见.
几个特殊的路径:
- self: 本模块.
- crate: 本编译单元 (crate).
- super: 父模块.
All articles in this blog are licensed under CC BY-NC-SA 4.0 unless stating additionally.
Comment
GitalkValine