无论如何,C函数参数中的奇怪标题如下:
void func_name(int a, int b) {
}
然而在Rust:
fn func_name(a: int, b: int) {
}
这只是语法上的偏好,对Rust的创作者有吸引力,还是出于我不了解的特定目的?例如,Go有“可选的分号”,但它们实际上是在表达式结束时显示的。请记住,我是Rust的完全新手,所以如果你试着在Rust中提供一些奇特的例子,我可能不会理解:(
答案 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)
使用不同的语法来声明局部变量和函数参数会很奇怪,你不觉得吗?