あるプログラマの日記

プログラマのメモ、出来事、考えたこと、勉強とかの雑記

デフォルト引数、名前付き引数

デフォルト引数

関数、メソッドの定義で引数にデフォルト値を指定できる。

  • デフォルト引数は引数の一部またはすべてに指定できる。
  • デフォルト引数は、関数、メソッドの定義の際に 引数名: 型 = デフォルト値 の形式で定義する。
  • 可変長引数と併用することはできない。
  • 呼び出し時に引数を省略すると定義したデフォルト値が使用される。
  • 引数全てにデフォルト値が定義されている場合で、全ての引数を省略してメソッドを呼び出す場合 () は省略できない。
scala> def foo(list: List[String], s: String = ",") = list.mkString(s)
foo: (list: List[String], s: String)String

scala>  val list = List("foo", "bar", "hoge")
list: List[java.lang.String] = List(foo, bar, hoge)

scala> foo(list)
res0: String = foo,bar,hoge

scala> foo(list, "-")
res1: String = foo-bar-hoge

scala> def foobar(a: String = "foo", b: String = "bar") = a + b
foobar: (a: String, b: String)java.lang.String

scala> foobar
<console>:9: error: missing arguments for method foobar in object $iw;
follow this method with `_' if you want to treat it as a partially applied function
       foobar
       ^

scala> foobar()
res3: java.lang.String = foobar

名前付き引数

関数、メソッドの呼び出し時に引数名を指定して呼び出せる。

  • 呼び出し時に 引数名 = 値 の形式で指定する。
  • 名前付き引数で呼び出す場合は任意の順番に変えることができる。
  • 引数が多い場合は、名前付き引数を使用すると可読性が良くなる。
  • デフォルト引数と名前付き引数を組み合わせると引数の数の違いによるオーバーロードが不要になり可読性も良くなる。
scala> def bar(year: Int = 2012, month: Int = 4, day: Int= 7) = "%04d/%02d/%02d".format(year, month, day)
bar: (year: Int, month: Int, day: Int)String

scala> bar(month = 5, day = 5)
res4: String = 2012/05/05

scala> bar()
res5: String = 2012/04/07

scala> bar(day = 10)
res6: String = 2012/04/10

scala>  bar(month = 8)
res7: String = 2012/08/07

scala> bar(month = 7, day = 1, year = 2014)
res8: String = 2014/07/01

scala>  bar(2014, month = 7)
res9: String = 2014/07/07

scala>  bar(2014, month = 7, 2)
res10: String = 2014/07/02