Rust Coercions

Table of Contents

1. Rust Coercions

coercions 是指 a 与 b 交互时, 对于不一致的类型做隐式的类型转换的过程.

1.1. coercion site

coercion site 指 coercion 发生的场合

  1. let 赋值

    let x:i32 = 10 时, 10 => i32

  2. 函数调用

    fn foo(x: i32){}; foo(10) 调用时, 10 => i32

  3. 方法调用

    fn foo(&self){}; test.foo() 调用时, test => &self

  4. 函数返回

    fn foo() -> i32 {return 10;}; foo 返回时, 10 => i32

  5. 复合类型赋值
    • stuct

      struct test (i32); let x=test(10), 10 => i32

    • tuple
    • [T;n]
  6. 其它
    • block 表达式 let x :i32 = {….; 10}, 10 => i32

1.2. coercion 的类型

  1. T => U, 如果 U 是 T 的 sub-type, 例如 T 转换为 trait
  2. T => U => V, 传递性
  3. &mut T => &T, 引用弱化
  4. 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

具体过程是:

  1. T 通过一系列的 deref 变为一个类型的序列, 例如, 原始类型为 &&T, 则序列为 {&&T, &T, T)
  2. 遍历这个序列, 针对每个类型 U
    • 检查 U 是否与要求的类型一致
    • 若不一致, 对 U 进行一个 ref, 检查 &U 是否一致

针对上面的例子:

  1. 调用 test.foo(), test 类型为 T, 与要求的 &self 不一致, 进行一次 ref 后变为 &test, 与要求的一致了, 则最终调用 test.foo() 时, test 会隐式转型为 &test.
  2. let test=&&T(), 则会先进行一个 deref, 变为 &T, 然后发现一致.

以上只针对 method 的 receiver, method 及 function 的普通参数并不支持 auto-deref

Author: [email protected]
Date: 2019-01-05 Sat 00:00
Last updated: 2024-08-05 Mon 17:56

知识共享许可协议