Scala で tap メソッドを使う [Scala]
Ruby 1.9 で標準装備になったという tap メソッド [1] [2] というのがかなりかっこいい。この場合の tap って多分電源タップの意味だろうか。メソッドチェーンの流れを切るまいとする Ruby 的な発想なんだろうと思う。
というわけで Scala でもやってみた。仕組み自体はおなじみのもの。Scala でも特に問題無い様に思われる。
[1] http://www.infoq.com/jp/news/2008/02/tap-method-ruby19
[2] http://www.infoq.com/news/2008/02/tap-method-ruby19
というわけで 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
コメント 0