2010-01-14 21 views
13

El operador Groovy "in" parece significar cosas diferentes en casos diferentes. A veces, x in y significa y.contains(x) y, a veces, parece llamar al y.isCase(x).¿Cómo funciona el operador Groovy in?

¿Cómo sabe Groovy a cuál llamar? ¿Existe alguna clase o conjunto de clases que Groovy conozca que usen el método .contains? ¿O es el comportamiento desencadenado por la existencia de un método en uno de los objetos? ¿Hay algún caso en el que el operador en se cambie por algo completamente distinto?

Respuesta

15

lo hice un poco de experimentación y parece que el operador in se basa en el método isCase sólo como lo demuestra el siguiente código

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 

Para las clases de colección de JDK supongo que sólo parece que el operador in es basado en porque isCase() llama al para esas clases.

+1

Ok, eso tiene sentido. Estaba confundido acerca de la relación entre "en" e isCase. Puedo ver que ahora contiene sentido cuando se utiliza un contenedor como una etiqueta de caso. Sin embargo, reutilizar isCase para el operador in es algo sorprendente, ya que permite expresiones inesperadas como 'asdf' en String == true. – ataylor

+0

Esto es correcto, pero muy pobre por parte de groovy. Mientras que el comportamiento de las declaraciones de casos y que contienen un elemento utilizan la misma lógica con las colecciones, son muy diferentes en otras situaciones. Por ejemplo, la siguiente afirmación no pasa: afirme 'b' en 'bollos'. Esto es contrario a la intuición, por decir lo menos. –

+0

¿alguien puede decirme en pocas palabras lo que significa "Causa"? –

3

En realidad, todo se basa en isCase. Groovy agrega un isCase method to Collections que se basa en el método contains. Cualquier clase con isCase se puede usar con en.