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")