В чем разница между фигурными скобками и запятыми, когда они используются для разделения ветвей выражения соответствия? - PullRequest
1 голос
/ 30 мая 2020

Я только начал изучать Rust, и есть некоторые вещи, которые меня смущают.

Я прочитал вторую главу книги «Программирование игры в угадайку», и некоторые части кода заставляют меня задуматься, что правильно, а что нет .

Пример: Вот al oop Я задал другой вопрос :

 loop {
    ...

    match guess.cmp(&secret_number) {
        Ordering::Less => println!("Too small!"),
        Ordering::Greater => println!("Too big!"),
        Ordering::Equal => {
            println!("You win!");
            break;
        }
    }
}

Я понял, что могу написать это вместо:

 match guess.cmp(&secret_number) {
    Ordering::Less => {
        println!("Too low!") // without semicolon ;
    } // without comma ,
    Ordering::Greater => {
        println!("Too high!")
    }
    Ordering::Equal => {
        println!("You win!!!");
        break;
    }
 }

Меня это сбивает с толку, я не знаю, хорошо это или плохо, может ли это привести к критическим изменениям в будущем ... Может ли кто-нибудь помочь мне понять?

1 Ответ

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

Запятая в конце руки совпадения не обязательна, если используются фигурные скобки. Парсер / токенизатор ржавчины может однозначно анализировать спички с запятой или без нее. Посмотрите здесь: запятая не обязательна.

Все, что заканчивается точкой с запятой, является оператором, который не возвращает никакого значения (кроме оператора return <>;).

В первом случае

Ordering::Less => println!("Too small!"),

// Returns a unit value 

Во втором случае с фигурными скобками будет возвращена последняя строка без точки с запятой. В данном случае это значение единицы .

См. Этот пример:

   let flag = false; 

   let result = match flag {
        false => {
            println!("in false arm");
            100
        },
        true => {
            println!("In true arm");
            200
        }
   };
   println!("result = {}", result);

Это напечатает следующее:

in false arm
result = 100

https://play.rust-lang.org/?version=stable&mode=debug&edition=2018&gist=f4a531293d9fc82459da0c3fbcf0e93d

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