2013-07-31 14 views
7

Czy istnieje jakiś odpowiednik w Groovy dla metody Ruby'ego Object#tap, który przekazuje obiekt do zamknięcia, w którym obiekt staje się self, a następnie zwraca obiekt? Wiem o DefaultGroovyMethods.with, ale wymaga to jawnego zwrócenia obiektu, aby móc go powiązać lub przypisać. Jeśli nie, czy istnieje sposób, w jaki mogę go zaimplementować samodzielnie i czy będzie on dostępny dla wszystkich obiektów, takich jak inne metody w DefaultGroovyMethods? Łatwo jest wdrożyć implementację DefaultGroovyMethods.with i zawsze zwracać obiekt zamiast zwracanej wartości zamknięcia, ale czy można go udostępnić wszystkim obiektom? Według this post nie ma sposobu na rozszerzenie DefaultGroovyMethods, ale czy jest jakiś inny sposób to zrobić?Groovy odpowiednik obiektu obiektu Ruby # tap

Odpowiedz

13

Nie ma podobny sposób, że znam w porywające, ale powinieneś być w stanie to zrobić:

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}" } 

drukuje:

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, to jest cool! =) – elias

+4

Fajnie. Chciałbym zasugerować umieszczenie tego w rozszerzeniu :-) – Will

+0

Dzięki, to świetnie! –

Powiązane problemy