运算符中的Groovy如何工作?

ata*_*lor 13 groovy operators in-operator

在不同的情况下,Groovy"in"运算符似乎意味着不同的东西.有时x in y意味着y.contains(x),有时它似乎打电话y.isCase(x).

Groovy如何知道要调用哪一个?是否有一个特定的类或一组类Groovy知道哪些使用.contains方法?或者是由于某个对象上存在方法而触发的行为?是否有任何情况下in运算符完全变为其他东西?

Dón*_*nal 15

我做了一些实验,看起来in操作符仅基于该isCase方法,如下面的代码所示

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
Run Code Online (Sandbox Code Playgroud)

对于JDK集合类,我想它似乎是in运算符基于contains()因为对这些类的isCase()调用contains().


cii*_*is0 5

in是“会员运营商”。

来自Groovy 3 的文档(重点是我的):

8.6。会员经营者

成员资格运算符 ( in) 相当于调用该isCase 方法。在 a 的上下文中List,它相当于调用 contains,如以下示例所示:

def list = ['Grace','Rob','Emmy']
assert ('Emmy' in list)           # (1)    
Run Code Online (Sandbox Code Playgroud)

(1)相当于调用list.contains('Emmy')list.isCase('Emmy')

因此,Groovy 总是调用,在 a映射到 的isCase情况下。Listcontains