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

问题描述 投票:10回答:1

要在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时?

variables types rust constants
1个回答
14
投票

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

但是,你是对的:编译器可以推断它。有一个公开的讨论:#1349,TL; DR:

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

值得一提的是,Rust中类型推断的指导原则之一是类型推断应该是局部的。这就是为什么,与Haskell不同,函数签名总是需要完全指定。这有多种原因,特别是它意味着更容易推理人类读者和更好的错误信息。这使得模块级别const处于一个艰难的位置,推断。 Matthieu M.

到目前为止,仍然没有提议的RFC,所以这个问题保持开放。

也可以看看:

© www.soinside.com 2019 - 2024. All rights reserved.