为什么必须为“ const”变量指定类型,而不为“ let”变量指定类型?

时间:2019-04-05 08:50:37

标签: variables types rust constants

要在Rust中创建变量,请使用

let var_name = 10;

这也将是有效的:

let var_name: i32 = 10;

常量变量是这样创建的:

const VAR_NAME: i32 = 10;

但是,如果您尝试创建这样的常量变量:

const VAR_NAME = 10;

您会收到如下错误:

error: expected `:`, found `=`
 --> src/main.rs:5:11
  |
4 |   const VAR_NAME = 10;
  |                 ^ expected `:`

来自JavaScript,Python和PHP之类的语言使我感到困惑。

为什么在使用const时必须指定类型定义,而在使用let时却不必指定类型定义?

1 个答案:

答案 0 :(得分:14)

当前,有一个rule“必须显式键入常量”。 (对于static:“静态项目类似于常量”)。

但是,您是对的:编译器可以推断出它。对此进行了公开讨论:#1349,TL; DR:

  • 我们可以从技术上推断conststatic变量的类型
  • 我们不经常使用它们,因此注释类型不是很烦人
  • 我们应该将常量/静态类型的推断限制为仅文字值
  • 这可能会使错误消息的准确性降低
  • 也许可以将常量/静态变量的类型限制为函数体之类的局部作用域
  • 对于整数,const FOO = 22会推断为i32,因此可能不是人们期望的类型。所以我们最终写了const FOO = 22usize
  • 使用const-fn初始化变量时,应推断类型
  • 使用另一个明确键入的变量初始化变量时
  • 对于数组,显式类型非常冗余
  • 对于仅导出的变量,我们最终可能无法推断它们的类型(因此这将是编译时错误“需要指定类型”)
  

值得一提的是,Rust中类型推断的指导原则之一是类型推断应该是局部的。这就是为什么与Haskell不同的是,始终需要完全指定函数签名的原因。造成这种情况的原因多种多样,尤其是对于人类读者而言,这意味着更容易的推理以及更好的错误消息。推论着,这使模块级别const处于困境。 Matthieu M.

到目前为止,仍然没有提议的RFC,因此这个问题仍然存在。

另请参阅: