语句、表达式
Rust
的函数体是由一系列语句组成,最后由一个表达式来返回值(与Typescript
很相似),例如:
rust
fn add_with_extra(x: i32, y: i32) -> i32 {
let x = x + 1; // 语句
let y = y + 5; // 语句
x + y // 表达式
}
fn add_with_extra(x: i32, y: i32) -> i32 {
let x = x + 1; // 语句
let y = y + 5; // 语句
x + y // 表达式
}
表达式
表达式会进行求值,然后返回一个值。例如5 + 6
,在求值后,返回值11
,因此它就是一条表达式。
表达式可以成为语句的一部分,例如let y = 6
中,6 就是一个表达式,它在求值后返回一个值 6(有些反直觉,但是确实是表达式)。
调用一个函数是表达式,因为会返回一个值,调用宏也是表达式,用花括号包裹最终返回一个值的语句块也是表达式,总之,能返回值,它就是表达式:
rust
fn main() {
let y = {
let x = 3;
x + 1
};
println!("The value of y is: {}", y);
}
fn main() {
let y = {
let x = 3;
x + 1
};
println!("The value of y is: {}", y);
}
该语句块是表达式的原因是:它的最后一行是表达式,返回了x + 1
的值,注意x + 1
不能以分号结尾,否则就会从表达式变成语句,表达式不能包含分号。这一点非常重要,一旦你在表达式后加上分号,它就会变成一条语句,再也不会返回一个值,请牢记!
最后,表达式如果不返回任何值,会隐式地返回一个()
。
rust
fn main() {
assert_eq!(ret_unit_type(), ())
}
fn ret_unit_type() {
let x = 1;
// if 语句块也是一个表达式,因此可以用于赋值,也可以直接返回
// 类似三元运算符,在Rust里我们可以这样写
let y = if x % 2 == 1 {
"odd"
} else {
"even"
};
// 或者写成一行
let z = if x % 2 == 1 { "odd" } else { "even" };
}
fn main() {
assert_eq!(ret_unit_type(), ())
}
fn ret_unit_type() {
let x = 1;
// if 语句块也是一个表达式,因此可以用于赋值,也可以直接返回
// 类似三元运算符,在Rust里我们可以这样写
let y = if x % 2 == 1 {
"odd"
} else {
"even"
};
// 或者写成一行
let z = if x % 2 == 1 { "odd" } else { "even" };
}