我对Rust很感兴趣,所以我开始阅读Rust网站上的Rust编程指南,发现变量是按以下方式声明的:
let x: i32 = 5;
这意味着将值整数5赋值给变量类型整数32位,从这一点开始,该符号将由符号 x
引用 .
我的主要问题是为什么 let
关键字根本就存在?这似乎是多余的,好像它实际上并没有任何东西 .
我假设编译器能够告诉以下是变量(或const变量)声明:
x: i32 = 5;
似乎没有理由使用 let
关键字,但可能有一个明智的理由,因为Rust专注于安全性 . 那是什么原因?
编辑:添加:作为函数参数,不需要let关键字 . 这是一个例子:
fn add1(x: i32) -> i32
{
x = x + 1
}
这似乎有点奇怪 - 这个"looks like"由于缺少 let
而被引用传递 . 但它是值得传递的 . (或者至少我认为是 . )这是句法上的不一致吗?
顺便说一句,我会发现改变这个陈述并写下来更合乎逻辑:
i32 x = 5;
如果你愿意,可以在那里放一个冒号:
i32: x = 5;
我想我会发现更合乎逻辑的原因是:
- 编程时,在想到它的名称之前,通常知道你想要的数据是什么"type" .
也许有些人认为反过来?但这让我想到另一点;如何在Rust中声明几个相同类型的变量?如:
let x, y, z: i32 = {4, 5, 5} // A guess of what this might look like?
或者这只是Rust中不允许的?
3 回答
Rust具有本地类型推断,因此通常不需要编写类型;
let x = 5;
就够了 .x = 5;
会完全不同,因为它不会声明变量x
,而Rust非常故意将声明和赋值分开 .它实际上也是
let PATTERN = EXPR;
,而不仅仅是let IDENT = EXPR;
,因此删除let
关键字会导致语法模糊 . 一个模式可能是mut x
(使变量绑定变为可变),它可能是(a, b)
表示元组解包,&c .你只认为
i32 x = 5;
是有道理的,因为你已经习惯了像C这样的语言 . 说真的,谁提出了这个想法?在纯粹的哲学理由中,在名称之后使用类型比以前更有意义,只有声明变量的类型也是愚蠢的 . 各种各样的语法模糊 . 类型推断,允许你完全省略类型,是一个更好的方法全面 .首先,解析歧义 . 虽然有可能解析这样的代码(但是因为
a < b > c
因为不同的原因而已经非法表达),它会使所有工具复杂化并使解析器性能(和错误恢复)变得更糟 .第二,类型推断 . 无论何时写入类型,都可以省略,因此您需要
let
或其他标记来区分赋值和声明 . (你可以在技术上使用let x = ...;
和Type x = ...;
,但为什么呢?它缺少一种类型 . ) - 1274390_ s缺少一种类型 . )第三,普遍性 .
let
适用于任何(无可辩驳的)模式,包括那些兼作完美合法表达式的模式:StructLiteral { field: x, other_field: y }
和Some(thing)
. 如果不是解析器(它当前拒绝Some(a) = b
),那么对于人类而言,这是更加模糊的来源 .第四,虽然你可能习惯了
type name
,但是它有着悠久的传统,而且它正在做(例如在Scala中) .第五,我对此提出异议:
也许我知道数据的一般形状(整数,字符串,迭代器,集合等),但确切的类型通常是第二个实现细节 . 在类型推断面前,这个论点也分崩离析:如果只是在编写代码时只讨论你的想法,那么如何将类型排除在外,那么案例就会被驳回:代码的读取频率远高于它写的是,引入概念的顺序不需要(通常也不应该)反映它们被构思的顺序 .
它显着简化了语法 . 记住,那里's a full pattern on the left hand side, it'实际上不是
let var
它是let pattern
.这是一个完全不同的问题,但没有直接的方法来做到这一点,不,至少不是这样你在考虑 . 您可以
但它们不一定是同一类型,这是一种行动中的解构模式 .