2013-07-31 9 views
7

RubyのObject#tapメソッドと同等のものがありますか?オブジェクトがクロージャに渡され、オブジェクトが自己になりオブジェクトを返すかどうか?私はDefaultGroovyMethods.withについて知っていますが、それを連鎖させたり、割り当てることができるようにするには、オブジェクトを明示的に返す必要があります。もしそうでなければ、自分でそれを実装し、DefaultGroovyMethodsの他のメソッドのようにすべてのオブジェクトで利用できるようにする方法はありますか? DefaultGroovyMethods.withの実装を取り、クロージャの戻り値の代わりにオブジェクトを返すのは簡単ですが、すべてのオブジェクトで使用できるようにすることはできますか? this postによれば、DefaultGroovyMethodsを拡張する方法はありませんが、それを行う他の方法はありますか?Rubyのオブジェクト#タップのGroovy相当

答えて

13

私はグルーヴィーでの知って何も同様の方法はありませんが、あなたが行うことができるはず:

Object.metaClass.tap = { Closure c -> 
    delegate.with c 
    delegate 
} 

(1..10)       .tap { println "original ${it}" } 
     .findAll { it % 2 == 0 } .tap { println "evens ${it}" } 
     .collect { it * it }  .tap { println "squares ${it}" } 

プリント:

original [1, 2, 3, 4, 5, 6, 7, 8, 9, 10] 
evens [2, 4, 6, 8, 10] 
squares [4, 16, 36, 64, 100] 
+1

OK、それはクールです! =) – elias

+4

クール。私はこれを拡張子に入れてお勧めしたいと思います: – Will

+0

ありがとう、それは素晴らしいです! –