関数の末尾の値とブロック式
関数の末尾の式
Scalaの関数では末尾で評価された式が返却値になります。
object Main extends App{ println(add(2, 8)) def add(x :Int, y :Int) :Int = { 1 + 2 + 3 "hoge" x + y } }
結果は、"hoge"と表示されます。
ブロック式
中括弧{}で構成された式をブロック式と言います。ブロック式では、ブロックの末尾の式が最終的な評価値になります。
object Main extends App{ val x = {100; "hoge"; true; 3.3333} println(x) }
上記のプログラムでは、3.3333と表示されます。
思ったこと・気づいたこと
ブロックの末尾
数の末尾の値が返却されるのは、ブロック式とは関係の無い仕様だと思っていました。
文と式
そもそもブロックは文だと勘違いしていました。実際は式です。
文と式には次のような違いがあります。
- 文(Statement)は評価しても値にならない。
- 式(Expression)は評価して値になる。
そして、次のようなプログラムを書くと、実行結果は()と表示されます。
object Main extends App{ println({val n = 1}) }
()はUnit型の値なので、val n = 1は式のように思えるのですが、実際は文です。
()はval n = 1が返しているのではなく、{}を評価したprintlnが返しているみたいです。
追記
EOP(ほぼすべて式で構成されるプログラミング)という考え方も存在するらしいです。
An expression-oriented programming language is a programming language where every (or nearly every) construction is an expression and thus yields a value.
Expression-oriented programming language - Wikipedia