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

druckt true. Was muss ich überlasten, um in für irgendein Objekt zu unterstützen?Wie überlade ich den In-Operator in Groovy?

Beispiel:

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

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

Ich weiß, ich könnte die Sammlung machen diese Klasse Öffentlichkeit verwendet, aber ich möchte in stattdessen verwenden.

+0

Können Sie eine Probe von dem geben, was Sie tun möchten? –

Antwort

8

Ich fragte auf der Groovy-Mailing-Liste. Here's der Thread. Die Antwort ist isCase

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

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

Süß. Nach einer schnellen Suche sieht das hier folgendermaßen aus: http://docs.codehau.org/display/GROOVY/JN2535-Control#JN2535-Control-ConditionalStatements –

+0

+1. Ich wünschte, ich könnte Guillaume Laforge für diese +1 wählen, schließlich war er derjenige, der es auf der Mailingliste beantwortet hat ;-) – Leonel

1

Ich frage mich, ob dies möglich ist, ist die Mitgliedschaft Operator (in) nicht auf der Operator Overloading Seite aufgeführt.

+0

Ich habe das auch bemerkt. – Geo

2

Sie könnten Whatever implementieren Collection oder eine Sammlung Subinterface. Groovy hat eine iterator()implementation für Object, und es sieht aus wie für Operatoren, die auf Aggregatobjekte arbeiten, wird Groovy versuchen, das Objekt in eine Sammlung zu konvertieren und dann die Aggregatfunktion ausführen.

Alternativ können Sie WhateverIterable implementieren können. Ich versuche immer noch, eine Referenz dafür zu finden und einen Proof of Concept zu schreiben, um es zu verifizieren.

Die Groovy documentation for the Iterator Pattern könnte anzeigen, dass dies funktioniert.