Scala で名前付き引数 [Scala]
Scala に名前付き引数ってないのかなと思って調べてみたら、プリミティブとしてはなかったけど組み立てることはできたので紹介。まずは名前付き引数を実現するのに必要な道具立てから。
1. Scala は可変長引数が扱える
引数の型の後に * を付けると可変長引数が取れます。
scala> def sum(nums: Int*) = { nums.foldLeft(0) { (sum, n) => sum + n } } sum: (Int*)Int scala> sum(1, 2, 3) unnamed0: Int = 6 scala> sum(1, 2, 3, 4, 5) unnamed1: Int = 15
2. Scala にもファットコンマがある
これはついさっきまで知りませんでしたが、タプルを作るのにコンマだけでなく「->」が使えます。
scala> ("Smith", 25) unnamed4: (java.lang.String, Int) = (Smith,25) scala> ("Smith" -> 25) unnamed5: (java.lang.String, Int) = (Smith,25)
Perl でハッシュリテラルを書くときに使うファットコンマによく似ています。
3. シンボルも使える
Scala ではあまり使う機会が少ないですがアポストロフィで始まる識別子はシンボルとなります。
scala> 'foo unnamed6: Symbol = 'foo
4. Scala には Any 型がある
Java でいう Object 型のように使えます。
さて、ここまで揃うと名前付き引数のようなことがわりとあっさりできてしまいます。
scala> def named(args: (Symbol, Any)*) = { for (arg <- args) Console.println(arg) } named: ((Symbol, Any)*)Unit scala> named('title -> "Hello", 'width -> 800, 'height -> 600) ('title,Hello) ('width,800) ('height,600) unnamed7: Unit = ()
標準ライブラリでこうしたことをしているものは見つかりませんでしたが、scala.collection.immutable.Map のオブジェクトを作るときは以下のように連想配列リテラル風味の書き方ができるようになっています。
scala> Map("Smith" -> 25, "Sally" -> 28) unnamed8: scala.collection.immutable.Map[java.lang.String,Int] = Map(Smith -> 25, Sally -> 28)
コメント 0