Expression 是普林顿!表达还是陈述?
我正在浏览Rust文档(书),对它使用分号分隔语句感到困惑 在一个例子中,它使用Expression 是普林顿!表达还是陈述?,expression,rust,Expression,Rust,我正在浏览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() {
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");
}
}
分号消失了,表示println
不是一个语句,而是此上下文中的一个表达式。我不明白为什么。。。我错过了什么 println!()
是扩展为表达式的宏。它有,但它是一个表达式(主要是因为几乎所有东西都是表达式,包括函数调用和块)
有一个惯例——我不知道它有多普遍,但我遵循它——将产生函数调用的(
)视为伪语句,仅用于其副作用,因此即使在没有严格必要时也用分号终止它们。这是在第一个代码段中完成的
在第二个代码片段中,我们有一个match
,match-arms需要一个表达式。我们可以使用块(Ordering::Less=>{println!(“Less”);}
),但这是一个相当大的语法噪音,只是为了更清楚地说明手臂是用于它们的副作用,所以我想作者刚刚停止了它。println!()
是扩展为表达式的宏。它有,但它是一个表达式(主要是因为几乎所有东西都是表达式,包括函数调用和块)
有一个惯例——我不知道它有多普遍,但我遵循它——将产生函数调用的(
)视为伪语句,仅用于其副作用,因此即使在没有严格必要时也用分号终止它们。这是在第一个代码段中完成的
在第二个代码片段中,我们有一个match
,match-arms需要一个表达式。我们可以使用块(Ordering::Less=>{println!(“Less”);}
),但这是一个相当大的语法噪音,只是为了更清楚地表明手臂是用于其副作用的,所以我想作者刚刚停止了它。让赋值语句也是语句吗?因为即使在Haskell中也可以有定义。@ziggystar AFAIKlet
不是表达式。({let x=e1;e1}
虽然如此。)let
赋值也是语句吗?因为即使在Haskell中也可以有定义。@ziggystar AFAIKlet
不是表达式。({let x=e1;e1}
虽然如此)。
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"),
}
}