gpt4 book ai didi

expression - 是println!表达或陈述?

转载 作者:行者123 更新时间:2023-11-29 08:23:05 24 4
gpt4 key购买 nike

我正在阅读 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 ,但它一个表达式(主要是因为几乎所有东西都是表达式,包括函数调用和 block )。

有一个约定——我不知道它有多普遍,但我个人遵循它——将生成 () 的函数调用视为伪语句,仅用于它们这边效果,因此即使不是绝对必要,也可以用分号终止它们。这是在第一个片段中完成的。

在第二个片段中,我们有一个match,并且 match arms 需要一个表达式。可以使用 block (Ordering::Less => { println!("less"); }) 但这是相当多的句法噪音,只是为了更加清楚地表明 ARM 用于它们的副作用,所以我想作者只是放弃了。

关于expression - 是println!表达或陈述?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28439614/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com