2009-10-17 11 views
7
def array = [1,2,3,4,5] 
println 3 in array 

stampe true. Cosa devo sovraccaricare per supportare in per qualsiasi oggetto?Come sovraccarico l'operatore in in Groovy?

Esempio:

class Whatever { 
    def addItem(item) { 
     // add the item 
    } 
} 

def w = new Whatever() 
w.addItem("one") 
w.addItem("two") 
println "two" in w 

so che potrei fare la raccolta questa classe utilizza pubblica, ma vorrei usare in invece.

+0

Puoi fornire un esempio di cosa ti piacerebbe fare? –

risposta

8

Ho chiesto sulla mailing list di Groovy. Here's il thread. La risposta è isCase

class A 
{ 
    def isCase(o) { 
    return false; 
    } 
} 

a = new A() 
println 6 in a // returns false 
+0

Dolce. Dopo una rapida ricerca, sembra che sia documentato qui: http://docs.codehaus.org/display/GROOVY/JN2535-Control#JN2535-Control-ConditionalStatements –

+0

+1. Vorrei poter votare Guillaume Laforge per questo +1, dopotutto è stato lui a rispondere sulla mailing list ;-) – Leonel

1

Mi chiedo se questo è possibile, l'operatore di appartenenza (in) non è elencato nella pagina Operator Overloading.

+0

L'ho notato anch'io. – Geo

2

È possibile effettuare Whatever attuare Collection o una subinterfaccia di raccolta. Groovy ha un iterator()implementation per Object e sembra che per gli operatori che lavorano su oggetti aggregati, Groovy tenterà di convertire l'oggetto in una raccolta e quindi di eseguire la funzione di aggregazione.

In alternativa, si potrebbe essere in grado di avere Whatever implementare Iterable. Sto ancora cercando di trovare un riferimento per questo e scrivere una dimostrazione del concetto per verificarlo.

Il Groovy documentation for the Iterator Pattern potrebbe indicare che questo funzionerà.