首页 文章

Rust为什么要打扰“让”? [关闭]

提问于
浏览
6

我对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 回答

  • 8

    Rust具有本地类型推断,因此通常不需要编写类型; let x = 5; 就够了 . x = 5; 会完全不同,因为它不会声明变量 x ,而Rust非常故意将声明和赋值分开 .

    它实际上也是 let PATTERN = EXPR; ,而不仅仅是 let IDENT = EXPR; ,因此删除 let 关键字会导致语法模糊 . 一个模式可能是 mut x (使变量绑定变为可变),它可能是 (a, b) 表示元组解包,&c .

    你只认为 i32 x = 5; 是有道理的,因为你已经习惯了像C这样的语言 . 说真的,谁提出了这个想法?在纯粹的哲学理由中,在名称之后使用类型比以前更有意义,只有声明变量的类型也是愚蠢的 . 各种各样的语法模糊 . 类型推断,允许你完全省略类型,是一个更好的方法全面 .

  • 10

    首先,解析歧义 . 虽然有可能解析这样的代码(但是因为 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中) .

    第五,我对此提出异议:

    在编程时,您通常会在想到它的名称之前知道所需的“类型”数据 .

    也许我知道数据的一般形状(整数,字符串,迭代器,集合等),但确切的类型通常是第二个实现细节 . 在类型推断面前,这个论点也分崩离析:如果只是在编写代码时只讨论你的想法,那么如何将类型排除在外,那么案例就会被驳回:代码的读取频率远高于它写的是,引入概念的顺序不需要(通常也不应该)反映它们被构思的顺序 .

  • 31

    它显着简化了语法 . 记住,那里's a full pattern on the left hand side, it'实际上不是 let var 它是 let pattern .

    如何在Rust中声明几个相同类型的变量?

    这是一个完全不同的问题,但没有直接的方法来做到这一点,不,至少不是这样你在考虑 . 您可以

    let (a, b, c) = (1, 2, 3);
    

    但它们不一定是同一类型,这是一种行动中的解构模式 .

相关问题