メソッド定義

予約語 def

関数の定義は、予約語 def で行います。
def x = e
のようにすると、xが使用される時に毎回eが評価されます。
def で定義された名前は、名前を (未評価の) 定義の右辺で置き換えることによって評価されます。

メソッドの例

2 つの引数を取り、大きい方を返却する max メソッドの例で5が表示されます。

object HelloWorld extends Application {
  def max(x: Int, y: Int): Int = if (x < y) y else x
  print(max(3, 5))
}

「max(x: Int, y: Int) 」は、max メソッドがInt型の引数を2つ取ることを意味します。「max(・・・): Int」 は戻り値としてIntを返却する宣言となります。メソッド本体が、「if (x < y) y else x」となります。


上記のメソッドは、以下のようにも書くことができます。

  def max(x: Int, y: Int) = if (x < y) y else x

これは、メソッドの引数の方から返却値の型が推論できるためです。ちなみにメソッドパラメータについての型推論は行われないため、省略できません。

returnは不要?

上記例ではJavaで言うreturn文がありません。これは、Scalaではコードブロック中の最後の評価式の結果が、推論されて戻り値として返却されるため、明示的に戻り値を定義しなくてもよいからです。最後の評価がvoidを返却するJavaメソッドの場合は、メソッドはUnitを返却すると推論されます。
細かい話をすると、上記例のif-else文は評価式ではありませんが、Scalaではこのようなif-elseを三項演算子として評価するため、無事最大値が返却されるのです。

こんな書き方もあり

以下のようにすると、greetとするだけで"Hello"が出力されます。

object Main extends Application {
  def greet = println("Hello")
  greet              //Hello
}

通常Scalaでは、副作用を伴う関数は()を付けて定義します。上記例だと、画面に文字を出力する という副作用を伴うので()を付けた定義とするのがScala流のやり方です。