Следует ли мне заканчивать выражение на; внутри ал oop? - PullRequest
6 голосов
/ 30 мая 2020

Я только начал изучать Rust, и у меня часто возникают вопросы, на которые я не могу найти ответа. Я действительно не знаю, как и где разместить свой вопрос, поэтому я попробую ТАК.

Я начал читать документацию по Rust на веб-сайте и сделал пример игры «Угадай».

Я понял, что выражение match cmp внутри l oop можно превратить в оператор, и все по-прежнему работает. Поэтому мне интересно, почему и какую версию действительно следует предпочесть?

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?
    }
}

Ответы [ 2 ]

4 голосов
/ 30 мая 2020

match, if, loop и другие выражения, содержащие блоки {}, обрабатываются компилятором Rust специально. Когда эти выражения встречаются как операторы выражения , то есть не как часть большего выражения, а тип выражения, содержащего блок, - (), у вас нет поставить ; после него, чтобы отделить его от следующего оператора.

Это не относится к операторам выражения без блоков , которые всегда должны быть отделены от следующего оператора (если один существует) на ;, даже если их тип ().

Поскольку это правило существует, обычно в Rust не ставится ; после match, if, unsafe и др. c. когда они используются только для побочных эффектов или после for и while циклов (которые всегда используются только для побочных эффектов, поскольку всегда возвращают ()).

Тем не менее, Кажется, что и rustfmt, и Clippy устраивают дополнительные ;, поэтому, если вы предпочитаете его там по эстетическим c причинам, вы вряд ли кого-нибудь обидите, используя его.

1 голос
/ 30 мая 2020

В Rust l oop блоков ожидает типа «возврата» пустого типа (). Это тип, который возвращается, когда вы заканчиваете оператором и вообще ничего не возвращаете (например, {f();}). println! возвращает пустой тип, поэтому опубликованный вами код работает в любом случае, однако я бы сказал, что имеет смысл заканчивать его точкой с запятой.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...