значение последнего оператора внутри блока возвращается, если после него нет точки с запятой.
Технически возвращается последнее значение блока, если оно не отменено. Вне определенных 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 должен быть выполнен хотя бы один раз, чтобы это сработало