met*_*man 4 c language-design rust
无论如何,在C函数参数中奇怪的标题如下:
void func_name(int a, int b) {
}
Run Code Online (Sandbox Code Playgroud)
然而在Rust:
fn func_name(a: int, b: int) {
}
Run Code Online (Sandbox Code Playgroud)
这只是语法上的偏好,并且对Rust的创建者有吸引力,还是出于我不了解的特定目的?例如,Go有"可选的分号",但它们实际上是在表达式结束时显示的.请记住,我是Rust的一个完整的新手,所以如果你试图在Rust中提供一些奇特的例子,我可能不会理解:(
函数参数的声明只是Rust中变量声明的一个特例,因此您的问题的答案通常在于变量声明.
让我们从C开始:
a b = 1;
a = 2;
Run Code Online (Sandbox Code Playgroud)
从语法的角度来看,C不是很规律:
a b = 1;,a是类型,b是声明(并初始化)的新变量的名称a = 1;,a是先前声明的变量的名称,现在可以初始化或分配新值(覆盖前一个值).因此,在C中,知道a是类型还是变量名称需要向前看(即,如果后跟另一个变量,那么它是一个类型,否则它是一个变量).
现在,在Rust:
let a = 1;
a = 2;
Run Code Online (Sandbox Code Playgroud)
引入新变量的语法需要使用let关键字,没有歧义,也不需要预先消除歧义.由于Rust(let a = ...; let a = a.foo;)中的阴影,这一点更为重要.
问题是关于类型,所以让我们扩展示例:
let a: b = 1;
a = 2;
Run Code Online (Sandbox Code Playgroud)
在这种情况下,再次,没有必要向前看.紧接着let而来的变量名,只有解析后:而来的变量类型.
因此,Rust的语法只是为了避免向前看(Rust的目标是使用LL(1)语法)并且函数参数的语法只遵循常规语法.
哦,顺便说一下,并非所有参数都有一个类型:
impl Foo {
fn doit(&self);
}
Run Code Online (Sandbox Code Playgroud)