我应该用 ; 结束一个表达式吗?在一个循环内?

JCo*_*eau 6 rust

我刚开始学习 Rust,我经常有一些我找不到任何答案的问题。我真的不知道如何以及在哪里发布我的问题,所以我会尝试。

我开始阅读网站上的 Rust 文档,并做了猜谜游戏示例。

我意识到match cmp循环内的表达式可以变成一个语句,一切仍然有效。所以我想知道为什么和哪个版本应该是首选?

use rand::Rng;
use std::cmp::Ordering;
use std::io;

fn main() {
    println!("Guess the number!");

    let secret_number = rand::thread_rng().gen_range(1, 101);

    loop {
        println!("Please input your guess.");

        let mut guess = String::new();

        io::stdin()
            .read_line(&mut guess)
            .expect("Failed to read line");

        let guess: u32 = match guess.trim().parse() {
            Ok(num) => num,
            Err(_) => continue,
        };

        println!("You guessed: {}", guess);

        match guess.cmp(&secret_number) {
            Ordering::Less => println!("Too small!"),
            Ordering::Greater => println!("Too big!"),
            Ordering::Equal => {
                println!("You win!");
                break;
            }
        } // <=== here should it be ended as statement (;) or not?
    }
}
Run Code Online (Sandbox Code Playgroud)

tre*_*tcl 4

matchRust 编译器会特别处理、ifloop和其他具有块的表达式。当这些表达式作为表达式语句{}出现时,即作为较大表达式的一部分,并且具有块的表达式的类型为 时,您不必在其后面放置以将其与后面的语句分开。();

对于不带块的表达式语句,情况并非如此,它始终必须与后面的语句(如果存在)分隔开;,即使它们的类型是()

因为这条规则存在,所以在 Rust 中,当它们仅用于副作用时,通常不要放在;after matchifunsafe等之后,或者 afterforwhile循环(它们始终仅用于副作用,因为它们总是返回())。

也就是说,rustfmt 和 Clippy 似乎都对 extra 很满意;,所以如果你出于美观原因更喜欢它,那么你不太可能通过使用它来冒犯任何人。