yohhoyの日記

技術的メモをしていきたい日記

ブロック式とセミコロン

Rust言語では{}によるブロック構造も式(block expression)として扱う。[本記事はRust 1.0/Stable準拠]

ブロック式全体の評価結果は、次の型/値となる。

  • 唯一の部分式、または最終セミコロン;の次に出現する部分式の型/値。
  • ブロック式内が;で終わっている場合は、ユニット型(unit type)の値()
let a = { 1u8 + 2 + 3 };         // u8型の値6
let b = { println!("X"); 42 };   // i32型の値42
let c = { println!("Hello"); };  // unit typeの値()

関数本体から戻り値を返す場合などで、少し注意が必要となる。returnを明示するスタイルならあまり関係ないが、下記例では関数h()のみがコンパイルエラーとなる。*1

fn f() -> i32 { 1 }          // OK
fn g() -> i32 { return 1; }  // OK
fn h() -> i32 { 1; }         // NG
// error: not all control paths return a value [E0269]

C言語系統などの手続き型パラダイム言語ではセミコロンを “文(statement)の終端マーク” と解釈することが多いが、Rust言語では “部分式(expression)間の区切りマーク” と解釈する方が自然。*2

関連URL

*1:Rust言語ではreturn/break/continueのようなフロー制御機構さえも式として扱われる。

*2:Rust言語設計に影響を与えた他言語機能として、The Rust ReferenceではSML言語とOCaml言語の "semicolon statement separation" が挙げられている。