yoshikit1996’s diary

日々勉強したことの備忘録です。

関数の末尾の値とブロック式

関数の末尾の式

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

alvinalexander.com