2010-01-14 8 views
13

L'operatore "in" di Groovy sembra intendere cose diverse in diversi casi. A volte x in y significa y.contains(x) ea volte sembra chiamare y.isCase(x).Come funziona l'operatore di Groovy in?

Come fa Groovy a sapere quale chiamare? Esiste una particolare classe o un insieme di classi che Groovy sa su quale usare il metodo .contains? O il comportamento innescato dall'esistenza di un metodo su uno degli oggetti? Ci sono dei casi in cui l'operatore in viene trasformato in qualcos'altro interamente?

risposta

15

Ho fatto qualche sperimentazione e sembra che l'operatore in si basa sul metodo isCase solo come dimostra il seguente codice

class MyList extends ArrayList { 
    boolean isCase(Object val) { 
     return val == 66 
    } 
} 

def myList = new MyList() 
myList << 55 
55 in myList // Returns false but myList.contains(55) returns true  
66 in myList // Returns true but myList.contains(66) returns false 

Per le classi di raccolta JDK Credo che sembra proprio come l'operatore in è basato su perché isCase() chiama per tali classi.

+1

Ok, questo ha senso. Ero confuso sulla relazione tra "in" e isCase. Posso vedere ora contiene ha senso quando si utilizza un contenitore come etichetta del caso. Riutilizzare isCase per l'operatore in è un po 'sorprendente, dal momento che consente espressioni impreviste come' asdf 'in String == true. – ataylor

+0

Questo è corretto, ma imo povero da parte di Groovy. Mentre il comportamento dell'istruzione case e il contenimento di un elemento usano la stessa logica con le collezioni, sono molto diversi in altre situazioni. Ad esempio, la seguente asserzione non passa: asserire 'b' in 'buns'. Questo è controintuitivo per non dire altro. –

+0

qualcuno può, per favore, dirmi in breve che cosa significaCase? –

3

In realtà è tutto basato su isCase. Groovy aggiunge uno isCase method to Collections basato sul metodo contains. Qualsiasi classe con isCase può essere utilizzata con.