読者です 読者をやめる 読者になる 読者になる

Scala 2.8 で追加されたデフォルト引数


Scala 2.8 からメソッドの引数にデフォルト値を指定できるようになりました。


Scala 2.7 系では引数にデフォルト値を用意したい場合は、

object StringUtil {

  def joiner(strings: List[String], separator: String): String =
    strings.mkString(separator)

  // デフォルトのセパレータを使うメソッド
  def joiner(strings: List[String]): String = 
    joiner(strings, " ")
}

メソッドをオーバーロードして joiner メソッドを 2 つ用意する必要がありました。


実行すると以下のようになります。

import StringUtil._
joiner(List("Programming", "Scala"), ":")  // Programming:Scala
joiner(List("Programming", "Scala"))       // Programming Scala


ちなみにオーバーロード時の戻り値の省略は以下は可能ですが、

def joiner(strings: List[String], separator: String) = strings.mkString(separator)
def joiner(strings: List[String]): String = joiner(strings, " ")

これはコンパイルエラーとなります。

def joiner(strings: List[String], separator: String) = strings.mkString(separator)
def joiner(strings: List[String]) = joiner(strings, " ")

メソッドのデフォルト引数

2.8 ではメソッドのデフォルト引数が利用できるようになりました。上記 joiner メソッドは以下のように書くことができます。

object StringUtil {
  // separator のデフォルト値として " " を指定
  def joiner(strings: List[String], separator: String = " "): String =
      strings.mkString(separator)
}


もちろん実行結果は同一となります。

import StringUtil._
joiner(List("Programming", "Scala"), ":")  // Programming:Scala
joiner(List("Programming", "Scala"))       // Programming Scala

コンストラクタのデフォルト引数

Scala 2.7 までは補助コンストラクタにて以下のようにしていました。

class UserProfile(age: Int, location: String) {
  // 補助コンストラクタ
  def this(age: Int) = this(age, "Unknown")
}


コンストラクタの引数についてもデフォルト引数の指定が可能です。

class UserProfile(
  age: Int,
  location: String = "Unknown"
)