rust - Rust 的类型推断如何跨多个语句工作?

标签 rust type-inference

Rust 在相当高级的情况下执行类型推断。有人可以解释(或指出)描述什么可以推断和不能推断的规则吗?

第一个很简单:绑定(bind)的类型就是绑定(bind)表达式的类型:

let n = 10u32;

// Same as:
//   vvvvv
let n: u32 = 10u32;

下一个更让我惊讶:右边的泛型参数是从左边的绑定(bind)类型推导出来的:
let n: u32 = "10".parse().unwrap();

// same as:            vvvvvvv
let n: u32 = "10".parse::<u32>().unwrap();

这也适用于泛型类型的“成员函数”:
let b = Box::new(10u32);

// same as:
//        vvvvv      vvvvvvv
let b: Box<u32> = Box::<u32>::new(10u32);

但最奇怪的是跨语句的类型推断:
let v = Vec::new();   // no type!
v.push(10u32);        // apparently v is Vec<u32>?!
// v.push(10i32);     // type error

类型推断和类型推导的规则是什么?

最佳答案

Rust 使用 Hindley-Milner类型系统。它是一组关于根据使用情况建立表达式类型的规则。

可以在这里找到正式的描述和解释:

"What part of Hindley-Milner do you not understand?"

关于rust - Rust 的类型推断如何跨多个语句工作?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63890295/

相关文章:

rust - 宏不扩展插值标记树吗?

rust - 如何创建全局的可变单例?

rust - 如何在选项中引用特征对象?

string - 为什么我不能反转 str::split 的结果?

c++ - 类型在 SFINAE 中未继承以进行多重继承?

Java 8 : generic type inference fails on method reference?

java - 从 Scala 函数到 Java 函数的隐式转换

rust tokio trait bound 在 forward 方法上不满足

rust - 如何帮助类型推断系统推断闭包参数的类型?

f# - 如何编写通用数字的函数?