Rust Coercions
Table of Contents
1. Rust Coercions
coercions 是指 a 与 b 交互时, 对于不一致的类型做隐式的类型转换的过程.
1.1. coercion site
coercion site 指 coercion 发生的场合
let 赋值
let x:i32 = 10 时, 10 => i32
函数调用
fn foo(x: i32){}; foo(10) 调用时, 10 => i32
方法调用
fn foo(&self){}; test.foo() 调用时, test => &self
函数返回
fn foo() -> i32 {return 10;}; foo 返回时, 10 => i32
- 复合类型赋值
stuct
struct test (i32); let x=test(10), 10 => i32
- tuple
- [T;n]
- 其它
- block 表达式 let x :i32 = {….; 10}, 10 => i32
1.2. coercion 的类型
- T => U, 如果 U 是 T 的 sub-type, 例如 T 转换为 trait
- T => U => V, 传递性
- &mut T => &T, 引用弱化
- deref coercion, 若 T Deref to U, 则 &T => &U
1.3. method auto-deref
auto-dref 是指涉及到 method 时 receiver 匹配的规则, 例如, 若 test::foo 定义为 foo(&self), 调用 test.foo() 时, test 会通过 coercion 变为 &Test
具体过程是:
- T 通过一系列的 deref 变为一个类型的序列, 例如, 原始类型为 &&T, 则序列为 {&&T, &T, T)
- 遍历这个序列, 针对每个类型 U
- 检查 U 是否与要求的类型一致
- 若不一致, 对 U 进行一个 ref, 检查 &U 是否一致
针对上面的例子:
- 调用 test.foo(), test 类型为 T, 与要求的 &self 不一致, 进行一次 ref 后变为 &test, 与要求的一致了, 则最终调用 test.foo() 时, test 会隐式转型为 &test.
- let test=&&T(), 则会先进行一个 deref, 变为 &T, 然后发现一致.
以上只针对 method 的 receiver, method 及 function 的普通参数并不支持 auto-deref
1.4. Reference
- https://stackoverflow.com/questions/28519997/what-are-rusts-exact-auto-dereferencing-rules
- https://github.com/rust-lang/rfcs/blob/master/text/0401-coercions.md
- https://github.com/rust-lang/rfcs/blob/master/text/0241-deref-conversions.md
- https://users.rust-lang.org/t/why-does-this-compile-automatic-dereferencing/2183/2