2010-01-14 5 views
13

L'opérateur "in" Groovy semble signifier différentes choses dans différents cas. Parfois x in y signifie y.contains(x) et parfois il semble appeler y.isCase(x).Comment fonctionne l'opérateur Groovy?

Comment Groovy sait-il appeler? Existe-t-il une classe particulière ou un ensemble de classes que Groovy connaît et qui utilisent la méthode .contains? Ou le comportement est-il déclenché par l'existence d'une méthode sur l'un des objets? Y a-t-il des cas où l'opérateur in est changé entièrement en quelque chose d'autre?

Répondre

15

J'ai fait quelques expériences et il semble que l'opérateur in est basé sur la méthode isCase que comme le montre le code suivant

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 

Pour les classes de collection JDK je suppose qu'il semble tout comme l'opérateur in est basé sur car isCase() appelle pour les classes.

+1

Ok, cela a du sens. J'étais confus au sujet de la relation entre "in" et isCase. Je peux voir maintenant contient des sens lorsque vous utilisez un conteneur comme une étiquette de cas. Réutiliser isCase pour l'opérateur in est un peu surprenant, car il permet des expressions inattendues comme 'asdf' dans String == true. – ataylor

+0

C'est correct, mais imo pauvre de la part de groovy. Bien que le comportement des instructions de cas et contenant un élément utilise la même logique avec les collections, elles sont très différentes dans d'autres situations. Par exemple, l'assertion suivante ne passe pas: assertion "b" dans "brioches". C'est contre-intuitif pour dire le moins. –

+0

quelqu'un peut s'il vous plaît dites-moi en bref ce que signifie iscase? –

3

En fait, tout est basé sur isCase. Groovy ajoute un isCase method to Collections basé sur la méthode contains. Toute classe avec isCase peut être utilisée avec.