デフォルト引数、名前付き引数
デフォルト引数
関数、メソッドの定義で引数にデフォルト値を指定できる。
- デフォルト引数は引数の一部またはすべてに指定できる。
- デフォルト引数は、関数、メソッドの定義の際に 引数名: 型 = デフォルト値 の形式で定義する。
- 可変長引数と併用することはできない。
- 呼び出し時に引数を省略すると定義したデフォルト値が使用される。
- 引数全てにデフォルト値が定義されている場合で、全ての引数を省略してメソッドを呼び出す場合 () は省略できない。
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