【发布时间】:2019-01-09 12:42:41
【问题描述】:
在Rust 编程语言的Chapter 3 中,以下代码用作Rust 无法管理的类型推断的示例:
fn main() {
let condition = true;
let number = if condition { 5 } else { "six" };
println!("The value of number is: {}", number);
}
解释如下:
Rust 需要在编译时明确地知道
number变量是什么类型,因此它可以在编译时验证它的类型在我们使用number的任何地方都有效。如果number的类型仅在运行时确定,Rust 将无法做到这一点;如果编译器必须跟踪任何变量的多个假设类型,编译器会更复杂,并且对代码的保证更少。
我不确定我是否理解其中的原理,因为该示例确实看起来像是一个简单的编译器可以推断出类型的东西。
究竟是什么让这种类型推断如此困难?在这种情况下,condition 的值可以在编译时清楚地推断出来(这是真的),因此数字的类型也可以是(i32?)。
如果您尝试跨多个编译单元推断类型,我可以看到事情如何变得更加复杂,但是这个特定示例是否会增加很多编译器的复杂度?
【问题讨论】:
-
@Shepmaster 我认为这与类型推断有关,因为用于学习该语言的规范书籍明确表示它与类型推断有关......类型不需要在运行时更改,因为它可以在给定示例的编译时显式推断。
-
这不是类型推断问题。即使你明确输入
let number: i32 = ...,它仍然不会编译。 -
处理这种情况似乎很简单——假设这个特性存在;在什么情况下你会觉得它有用?你不能依赖它,因为一旦条件没有被简单地评估,那么你的代码就不能再编译了。
-
我还觉得有趣的是你决定不引用前面两句话(强调我的):
if块中的表达式计算为整数,而else块计算为字符串。这是行不通的,因为变量必须只有一个类型。就像 SilvioMayolo 提到的那样,您可以在此处为所有内容指定显式类型,从而消除任何推断。 -
没有敌意,只是真实的、诚实的困惑。您更愿意使用
typeof(if A { X } else { Y })由A、X和Y确定的语言,而不仅仅是X(只要X==Y),这让我很困惑。编译器编写者没有理由花时间研究这些看似没有人想要的用途如此有限的功能。
标签: rust type-inference