是println!表达或陈述?
Is println! an expression or a statement?
我正在阅读 Rust 文档(书籍),但对它使用分号分隔语句感到困惑。
在一个示例中,它使用 println!
宏作为以分号结尾的语句:
use std::cmp::Ordering;
fn cmp(a: i32, b: i32) -> Ordering {
if a < b { Ordering::Less }
else 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::Less }
else 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!
不是语句,而是这个上下文中的表达式。我不明白为什么......我错过了什么?
println!()
是扩展为表达式的宏。它有 no useful return value,但它 是 一个表达式(主要是因为几乎所有东西都是表达式,包括函数调用和块)。
有一个约定——我不知道它有多普遍,但我个人遵循它——将生成 ()
的函数调用视为伪语句,仅用于它们的副作用,因此,即使不是绝对必要,也可以用分号结束它们。这是在第一个片段中完成的。
在第二个代码片段中,我们有一个 match
,并且 match arms 需要一个表达式。可以使用块 (Ordering::Less => { println!("less"); }
),但这是相当多的句法噪音,只是为了更加清楚地表明手臂是用来产生副作用的,所以我想作者只是把它留下了。
我正在阅读 Rust 文档(书籍),但对它使用分号分隔语句感到困惑。
在一个示例中,它使用 println!
宏作为以分号结尾的语句:
use std::cmp::Ordering;
fn cmp(a: i32, b: i32) -> Ordering {
if a < b { Ordering::Less }
else 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::Less }
else 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!
不是语句,而是这个上下文中的表达式。我不明白为什么......我错过了什么?
println!()
是扩展为表达式的宏。它有 no useful return value,但它 是 一个表达式(主要是因为几乎所有东西都是表达式,包括函数调用和块)。
有一个约定——我不知道它有多普遍,但我个人遵循它——将生成 ()
的函数调用视为伪语句,仅用于它们的副作用,因此,即使不是绝对必要,也可以用分号结束它们。这是在第一个片段中完成的。
在第二个代码片段中,我们有一个 match
,并且 match arms 需要一个表达式。可以使用块 (Ordering::Less => { println!("less"); }
),但这是相当多的句法噪音,只是为了更加清楚地表明手臂是用来产生副作用的,所以我想作者只是把它留下了。