作者:老美1 | 来源:互联网 | 2023-05-22 16:04
我正在研究Rust文档(书),并对使用分号分隔语句感到困惑.
在一个示例中,它使用println!
宏作为以分号结束的语句:
use std::cmp::Ordering;
fn cmp(a: i32, b: i32) -> Ordering {
if a b { Ordering::Greater }
else { Ordering::Equal }
}
fn main() {
let x = 5;
let y = 10;
let ordering = cmp(x, y);
if ordering == Ordering::Less {
println!("less");
} else if ordering == Ordering::Greater {
println!("greater");
} else if ordering == Ordering::Equal {
println!("equal");
}
}
当使用match
表达式来简化它时...
use std::cmp::Ordering;
fn cmp(a: i32, b: i32) -> Ordering {
if a b { Ordering::Greater }
else { Ordering::Equal }
}
fn main() {
let x = 5;
let y = 10;
match cmp(x, y) {
Ordering::Less => println!("less"),
Ordering::Greater => println!("greater"),
Ordering::Equal => println!("equal"),
}
}
分号消失了,表明这println!
不是一个陈述,而是在这种情况下的表达.我不明白为什么......我错过了什么?
1> 小智..:
println!()
是一个扩展到表达式的宏.它没有有用的返回值,但它是一个表达式(主要是因为几乎所有东西都是表达式,包括函数调用和块).
有一个约定 - 我不知道它是多么常见,但我跟随它 - 将生成()
函数调用视为伪语句,仅用于它们的副作用,因此即使没有分号也会以分号终止它们严格必要的.这是在第一个片段中完成的.
在第二个片段中,我们有一个match
,匹配的武器期待一个表达式.一个人可以使用一个块(Ordering::Less => { println!("less"); }
),但这是一个相当多的句法噪音,只是为了更清楚,武器被用于他们的副作用,所以我想作者只是把它关闭.