Rust的功能参数语法相对于C&C的目的是什么?

时间:2015-04-11 16:25:12

标签: c rust language-design

无论如何,C函数参数中的奇怪标题如下:

void func_name(int a, int b) {

}

然而在Rust:

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

}

这只是语法上的偏好,对Rust的创作者有吸引力,还是出于我不了解的特定目的?例如,Go有“可选的分号”,但它们实际上是在表达式结束时显示的。请记住,我是Rust的完全新手,所以如果你试着在Rust中提供一些奇特的例子,我可能不会理解:(

2 个答案:

答案 0 :(得分:7)

函数参数的声明只是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);
}

答案 1 :(得分:0)

在正常的Rust代码中,变量以这种方式声明:

let x : i32 = 0;

C样式是不可能的,因为类型是可选的,所以前者等同于这个:

let x = 0i32;

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

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

fn foo(x : i32)

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