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

impresiones true. ¿Qué debo sobrecargar para admitir in para cualquier objeto?¿Cómo sobrecargo el operador in en Groovy?

Ejemplo:

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

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

sé que podría hacer que la colección utiliza esta clase pública, pero me gustaría utilizar in lugar.

+0

¿Puedes darnos una muestra de lo que te gustaría hacer? –

Respuesta

8

Lo pregunté en la lista de correo de Groovy. Here's el hilo. La respuesta es isCase

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

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

Dulce. Después de una búsqueda rápida, parece que está documentado aquí: http://docs.codehaus.org/display/GROOVY/JN2535-Control#JN2535-Control-ConditionalStatements –

+0

+1. Ojalá pudiera votar a Guillaume Laforge por este +1, después de todo, fue él quien lo contestó en la lista de correo ;-) – Leonel

1

Me pregunto si esto es posible, el operador de membresía (in) no está en la lista en la página Operator Overloading.

+0

Me di cuenta de eso también. – Geo

2

Puede hacer que Whatever implemente Collection o una subinterfaz de colección. Maravilloso tiene una iterator()implementation para Object, y parece que para los operadores que trabajan en los objetos agregados, maravilloso intentará convertir el objeto a una colección y luego realizar la función de agregado.

Alternativamente, usted podría poder tener Whatever implementar Iterable. Todavía estoy tratando de encontrar una referencia para esto y escribir una prueba de concepto para verificarlo.

El Groovy documentation for the Iterator Pattern podría indicar que esto va a funcionar.

Cuestiones relacionadas