returnがなくてびっくりする
Rustでは以下のようなコードが成立する
fn add(a: u32, b: u32) -> u32{
a+b
}
Rust初学者からするとこれはびっくりするし、なんだか気持ち悪く感じる
これが成立する理由は、最後の式で評価された値が戻り値になるという言語仕様のためである
式とは
Rustでは、ほとんどのコードが何らかの値を返す式(Expression)であり、式は値を生成するために評価される
式でないすべては、文(Statement)とされる
セミコロン;を付けることで、ExpressionをStatementにすることができる
勘違いポイント
たいていの言語で、例えばifは文である。しかし、Rustでは式となる
そのため、以下のようなコードも成り立つ
let a = if a < 0 { 0 } else { a };
ifの結果が値として評価されている、つまり式であるということになる
以下のようなスコープも式となる
{
a+1;
a*a
}
セミコロンのついているa+1;は文であり、スコープの最後で現れるのa*aが式である。スコープ全体としても式であり、最後の式の値を表す
関数の戻り値
初めに触れたように、Rustでは最後の式が戻り値になる。そのため関数を以下のように書ける。他の言語と比較して、何が式であるかを意識する必要がある
fn abs(value: i32) -> i32 {
if (value < 0) {
-value
} else {
value
}
}
参考
- Introduction - The Rust Reference
-
Rustにおいてbreakやreturnを含む式はどの型であっても良い
- breakやreturnなどが式としてどのように扱われるか書いてある