Как значение возвращается в ржавчине? - PullRequest
1 голос
/ 13 июля 2020

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

Далее код x + 1 (без точки с запятой после) возвращается и присваивается y.

fn main() {
    let x = 5;

    let y = {
        let x = 3;
        x + 1
    };

    println!("The value of y is: {}", y);
}

Вывод:

The value of y is: 4

Но в следующем фрагменте кода, как counter * 2 возвращается, хотя после него стоит точка с запятой.

fn main() {
    let mut counter = 0;

    let result = loop {
        counter += 1;

        if counter == 10 {
            break counter * 2;
        }
    };

    println!("The result is {}", result);
}

Вывод:

The result is 20

Ответы [ 2 ]

2 голосов
/ 13 июля 2020

значение последнего оператора внутри блока возвращается, если после него нет точки с запятой.

Технически возвращается последнее значение блока, если оно не отменено. Вне определенных c контекстов, где это синтаксически требуется, ; действительно подавляет значение «текущего блока» и заменяет его (), как вы можете видеть, пытаясь скомпилировать это:

fn main() {
    let a: u8 = { 0; };
}

Ошибка будет иметь вид E0308 Mismatched Types : поскольку a набирается явно, rust c ожидает, что значение блока будет u8, и жалуется, что получает () .

Но в следующем фрагменте кода возвращается счетчик * 2, хотя после него стоит точка с запятой.

Это потому, что есть два способа переопределить возвращаемые значения в определенных c контекстах, по крайней мере, в настоящее время:

  • return <expr> немедленно выйдет из текущей функции с результатом <expr> в качестве возвращаемого значения
  • break <expr> немедленно выйдет из текущего loop (или того, что соответствует указанной метке, если таковая имеется) с результатом <expr> как «l oop value», он работает только с loop (не while или for) b потому что l oop должен быть выполнен хотя бы один раз, чтобы это сработало
1 голос
/ 13 июля 2020

В редакции 2018 года циклы могут быть выражениями и, таким образом, возвращать значение. Это достигается с помощью синтаксиса break <value>;. Обратите внимание, что это работает только для loop циклов и не работает для while или for циклов.

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