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 i开发者_JS百科t 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?
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.
It's actually all based on isCase. Groovy adds an isCase method to Collections that is based on the contains method. Any class with isCase can be used with in.
in
is the "Membership operator".
From the documentation for Groovy 3 (emphasis mine):
8.6. Membership operator
The membership operator (
in
) is equivalent to calling theisCase
method. In the context of aList
, it is equivalent to callingcontains
, like in the following example:def list = ['Grace','Rob','Emmy'] assert ('Emmy' in list) # (1)
(1)
equivalent to callinglist.contains('Emmy')
orlist.isCase('Emmy')
So, Groovy always calls isCase
, which in case of a List
maps to contains
.
精彩评论