rust - 为什么 Rust 会为 "let"而烦恼?

标签 rust

<分区>

我对 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
}

这看起来有点奇怪 - 由于缺少 let,这“看起来像”通过引用传递。但事实并非如此。这是一个值(value)传递。 (或者至少我认为是。)这是句法不一致吗?


顺便说一句,我会发现改变这个陈述并写成更合乎逻辑:

i32 x = 5;

如果你愿意,可以在其中放一个冒号:

i32: x = 5;

我想我会发现这更合乎逻辑,因为:

  • 在编程时,您通常在想出数据名称之前就知道您需要什么“类型”的数据。

也许有些人认为相反?但这使我想到了另一点;如何在 Rust 中声明多个相同类型的变量?如:

let x, y, z: i32 = {4, 5, 5} // A guess of what this might look like?

或者这在 Rust 中是不允许的吗?

最佳答案

Rust 有本地类型推断,所以通常不需要写类型; let x = 5; 就足够了。 x = 5; 会完全不同,因为它不会声明一个变量x,而且 Rust 非常有意地将声明和赋值分开。

其实也是let PATTERN = EXPR;,不仅仅是let IDENT = EXPR;,所以去掉let关键字会造成语法歧义.模式可以是 mut x(使变量绑定(bind)可变),它可以是 (a, b) 表示元组解包,&c。

你只认为 i32 x = 5; 有道理,因为你习惯了像 C++ 这样的语言。说真的,谁想出了这个主意?从纯粹的哲学角度来看,在名称之后使用类型比之前更有意义,并且仅使用类型来声明变量也很愚蠢。那里有各种语法歧义。类型推断允许您完全省略类型,这是一种全面的更好的方法。

关于rust - 为什么 Rust 会为 "let"而烦恼?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32180684/

相关文章:

c - C 语言中 Scala 的 Option 或 Rust 的 Result 错误处理

multithreading - 在 Rust 中的线程之间共享可变变量

multithreading - CPU 密集型工作线程的协作中断的习惯用法是什么?

rust - 循环中的Rust所有权

json - 将多个JSON字段反序列化为Serde中的单个Vec

concurrency - 在 Rust 中实现 MultiplexStream

linux - 如何在不需要设置 LD_LIBRARY_PATH shell 变量的情况下键入 "cargo run"?

compiler-errors - Rust 借用编译错误

rust - 如何将 'None' 值传递给 Rust 中的异步函数

rust - 将 tokio::task::JoinHandle 存储在 HashMap 中并从另一个任务访问它