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

Log*_*nch 10 variables types constants rust

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

let var_name = 10;
Run Code Online (Sandbox Code Playgroud)

这也将是有效的:

let var_name: i32 = 10;
Run Code Online (Sandbox Code Playgroud)

常量变量是这样创建的:

const VAR_NAME: i32 = 10;
Run Code Online (Sandbox Code Playgroud)

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

const VAR_NAME = 10;
Run Code Online (Sandbox Code Playgroud)

您将收到如下所示的错误:

error: expected `:`, found `=`
 --> src/main.rs:5:11
  |
4 |   const VAR_NAME = 10;
  |                 ^ expected `:`
Run Code Online (Sandbox Code Playgroud)

来自JavaScript,Python和PHP等语言,这让我感到困惑。

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

Sta*_*eur 14

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

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

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

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

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

也可以看看:

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