Scalaのデフォルト引数

Scala勉強会@東北 第51回勉強会で途中まで読んだProgramming Scala(獏本) のChapter 2 Type Less Do Moreで出てきた話。

デフォルト引数は Ruby みたいに仮引数に書くのではなく、多重定義すると。

//Scala2.7系
//code-examples/TypeLessDoMore/string-util-v1-script.scala
//Version 1 of "StringUtil".

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

  def joiner(strings: List[String]): String = joiner(strings, " ")
}
import StringUtil._  // Import the joiner methods.

println( joiner(List("Programming", "Scala")) )

Rubyだとこんな感じ。

#Ruby
def joiner(string_array,separator=" ")
  string_array.join(separator)
end
puts joiner ["Programming","Scala"]

で、2.8ではRubyのように仮引数に書けるようになったと。というか、貘本は2.8対象なんですね。

//Scala2.8
// code-examples/TypeLessDoMore/string-util-v2-v28-script.scala
// Version 2 of "StringUtil" for Scala v2.8 only.

object StringUtil {
  def joiner(strings: List[String], separator: String = " "): String =
    strings.mkString(separator)
}
import StringUtil._  // Import the joiner methods.

println(joiner(List("Programming", "Scala")))

さらに、どのパラメータに値を入れるかを名前で指定できる。rubyというかRailsでよくやってるハッシュでパラメータ渡してるのと、デフォルト引数をあわせたみたいな感じでしょうか?

//named parameter
println(joiner(List("Programming", "Scala"), separator = " ")) 
println(joiner(strings = List("Programming", "Scala"), separator = " "))

パラメーターにわかりやすい名前をつけて、明示的に名前で指定すれば、コードの可読性があがるよってことかな。