SSブログ

Scala で tap メソッドを使う [Scala]

Ruby 1.9 で標準装備になったという tap メソッド [1] [2] というのがかなりかっこいい。この場合の tap って多分電源タップの意味だろうか。メソッドチェーンの流れを切るまいとする Ruby 的な発想なんだろうと思う。

というわけで Scala でもやってみた。仕組み自体はおなじみのもの。Scala でも特に問題無い様に思われる。

scala> class Tap[T](obj: T) {
     |   def tap(block: T => Unit): T = { block(obj); obj }
     | }
defined class Tap

scala> implicit def any2tap[T](obj: T): Tap[T] = new Tap(obj)
any2tap: [T](T)Tap[T]

scala> val l = List(2, 1, 4, 5, 3)
l: List[Int] = List(2, 1, 4, 5, 3)

scala> l.tap{x=>println(x)}.sort{_<_}.tap{x=>println(x)}.reverse.tap{x=>println(x)}
List(2, 1, 4, 5, 3)
List(1, 2, 3, 4, 5)
List(5, 4, 3, 2, 1)
res0: List[Int] = List(5, 4, 3, 2, 1)

scala> (123,"hello").tap{case (x,_)=>println(x)}.tap{case (_,y)=>println(y)}
123
hello
res1: (Int, java.lang.String) = (123,hello)


[1] http://www.infoq.com/jp/news/2008/02/tap-method-ruby19
[2] http://www.infoq.com/news/2008/02/tap-method-ruby19
nice!(0)  コメント(0)  トラックバック(0) 
共通テーマ:パソコン・インターネット

nice! 0

コメント 0

コメントを書く

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

トラックバック 0

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