SSブログ

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)

nice!(0)  コメント(0)  トラックバック(0) 
共通テーマ:パソコン・インターネット

nice! 0

コメント 0

コメントを書く

お名前:
URL:
コメント:
画像認証:
下の画像に表示されている文字を入力してください。

トラックバック 0

この広告は前回の更新から一定期間経過したブログに表示されています。更新すると自動で解除されます。