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);
}
奇怪的标题,反正在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);
}