2013-07-31 10 views
7

Esiste un equivalente in Groovy al metodo Object#tap di Ruby che passa l'oggetto a una chiusura in cui l'oggetto diventa self e quindi restituisce l'oggetto? Conosco DefaultGroovyMethods.with ma questo richiede di restituire esplicitamente l'oggetto per poterlo concatenare o assegnarlo. In caso contrario, c'è un modo per implementarlo da solo e renderlo disponibile per tutti gli oggetti come gli altri metodi in DefaultGroovyMethods? È abbastanza facile prendere l'implementazione di DefaultGroovyMethods.with e restituire sempre l'oggetto al posto del valore restituito della chiusura, ma può essere reso disponibile per tutti gli oggetti? Secondo this post non c'è modo di estendere DefaultGroovyMethods ma c'è un altro modo per farlo?Equivalente Groovy dell'oggetto Ruby n. Tap

risposta

13

Non c'è metodo simile, che io sappia in Groovy, ma si dovrebbe essere in grado di fare:

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

stampe:

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, che figata! =) – elias

+4

Freddo. Vorrei suggerire di inserirlo in un'estensione :-) – Will

+0

Grazie, è grandioso! –