Rust 的函数参数语法相对于 C 的目的是什么?

What is the purpose of Rust's function parameter syntax over C's?

奇怪的标题,反正在C函数中参数如下:

void func_name(int a, int b) {

}

但是在 Rust 中:

fn func_name(a: int, b: int) {

}

这只是语法上的偏好并且吸引了 Rust 的创建者,还是出于我不知道的特定目的?例如,Go 有 "optional semi-colons",但它们实际上是为了显示表达式何时结束。请记住,我是 Rust 的新手,所以如果你尝试提供一些 Rust 中的奇特示例,我可能不会理解:(

在普通的 Rust 代码中,变量是这样声明的:

let x : i32 = 0;

C风格是不行的,因为类型是可选的,所以前者相当于这个:

let x = 0i32;

您需要let关键字来声明声明名称的意图。

在函数声明中,类型是强制性的,不允许初始化,let 关键字没有意义。除此之外语法相同:

fn foo(x : i32)

使用不同的语法来声明局部变量和函数参数会很奇怪,你不觉得吗?

函数参数的声明只是 Rust 中变量声明的一个特例,因此你的问题的答案在于一般的变量声明。

让我们从 C:

开始
a b = 1;
a = 2;

从语法的角度来看,C 不太正则:

  • a b = 1;中,a是类型,b是声明(和初始化)的新变量的名称
  • a = 1;中,a是之前声明的变量名,现在要么初始化,要么赋新值(覆盖之前的值)。

因此,在C中,要知道a是类型还是变量名,需要向前看(即如果后面跟着另一个变量就是类型,否则就是变量)。

现在,在 Rust 中:

let a = 1;
a = 2;

引入新变量的语法需要使用let关键字,没有歧义,无需向前看消歧。由于 Rust 中的阴影,这一点尤为重要 (let a = ...; let a = a.foo;)。

尽管问题是关于类型的,所以让我们扩展示例:

let a: b = 1;
a = 2;

在这种情况下,同样,没有必要向前看。在 let 之后是变量名,只有在解析 : 之后才是变量类型。

因此,Rust 的语法只是为了避免向前看(Rust 旨在拥有 LL(1) 语法)并且函数参数的语法只是遵循常规语法。

哦,顺便说一句,并非所有参数都有类型:

impl Foo {
    fn doit(&self);
}