Scala 2.8 で追加された名前付き引数


Scala 2.8 にて名前付き引数(Named Arguments)が利用できるようになりました。

名前付き引数

以下のような joiner メソッドに対して、

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


以下のような呼び出しが可能です。

import StringUtil._
joiner(List("Programming", "Scala"))
joiner(strings = List("Programming", "Scala"))

strings と引数の名前を指定して呼び出しています(separator はデフォルト値の適用)。


以下のような呼び出しもあり、

import StringUtil._
joiner(List("Programming", "Scala"), " ")
joiner(List("Programming", "Scala"), separator = " ")

1つ目と2つ目を比較すると、2つ目の例は、第2引数がセパレータであることが示されているため理解しやすいコードとなっています。


以下のような呼び出しもありです。

joiner(strings = List("Programming", "Scala"), separator = " ")
joiner(separator = " ", strings = List("Programming", "Scala"))


でも、以下はコンパイルエラーになります。

joiner(separator = " ", List("Programming", "Scala"))

コンストラクタの名前付き引数呼び出し

名前付き引数はコンストラクタについても同様に適用できます。
以下のようなクラスがあった場合

object UserProfile {
  val UnknownLocation = ""
  val UnknownAge = -1
}

class UserProfile(
  location: String = UserProfile.UnknownLocation,
  age: Int         = UserProfile.UnknownAge)


このようなコンストラクタ呼び出しができます。

new OptionalUserProfileInfo
new OptionalUserProfileInfo(age = 29)
new OptionalUserProfileInfo(age = 29, location="US")


joiner メソッドと同じように以下はコンパイルエラーです。

new OptionalUserProfileInfo(age = 29, "US")


より詳しくはNamed and Default Arguments