2010-01-14 7 views
13

Der Groovy "in" -Operator scheint in verschiedenen Fällen unterschiedliche Dinge zu bedeuten. Manchmal x in y bedeutet y.contains(x) und manchmal scheint es y.isCase(x) zu rufen.Wie funktioniert der Groovy In Operator?

Woher weiß Groovy, wen man anrufen soll? Gibt es eine bestimmte Klasse oder Klasse von Klassen, die Groovy über die Verwendung der .contains-Methode weiß? Oder wird das Verhalten durch das Vorhandensein einer Methode auf einem der Objekte ausgelöst? Gibt es Fälle, in denen der In-Operator komplett in etwas anderes verwandelt wird?

Antwort

15

habe ich einige Experimente und es sieht aus wie die in Bediener auf der isCase Methode basiert nur wie durch den folgenden Code demonstriert

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 

Für die JDK Collection-Klassen ich denke, es scheint nur, wie der in Operator basierend auf , weil isCase() für diese Klassen aufruft.

+1

Ok, das macht Sinn. Ich war verwirrt über die Beziehung zwischen "in" und isCase. Ich kann jetzt sehen, dass es sinnvoll ist, Container als Case-Label zu verwenden. Die Wiederverwendung von isCase für den Operator in ist ein wenig überraschend, da es unerwartete Ausdrücke wie 'asdf' in String == true erlaubt. – ataylor

+0

Das ist richtig, aber imo von groovy schlecht. Während das Case-Statement-Verhalten ein Element enthält, das dieselbe Logik wie Collections verwendet, sind sie in anderen Situationen sehr unterschiedlich. Zum Beispiel wird die folgende Behauptung nicht bestanden: Assert 'b' in 'Brötchen'. Dies ist, um es milde auszudrücken, nicht einleuchtend. –

+0

kann mir bitte jemand kurz sagen, was isCase bedeutet? –

3

Es basiert eigentlich alles auf isCase. Groovy fügt eine isCase method to Collections hinzu, die auf der contains-Methode basiert. Jede Klasse mit isCase kann mit in verwendet werden.