Search code examples
groovyoperatorsin-operator

How does the Groovy in operator work?


The Groovy "in" operator seems to mean different things in different cases. Sometimes x in y means y.contains(x) and sometimes it seems to call y.isCase(x).

How does Groovy know which one to call? Is there a particular class or set of classes that Groovy knows about which use the .contains method? Or is the behavior triggered by the existence of a method on one of the objects? Are there any cases where the in operator gets changed into something else entirely?


Solution

  • I did some experimentation and it looks like the in operator is based on the isCase method only as demonstrated by the following code

    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
    

    For the JDK collection classes I guess it just seems like the in operator is based on contains() because isCase() calls contains() for those classes.