Groovy 的“in”运算符在不同的情况下似乎意味着不同的东西。有时x in y
意味着y.contains(x)
有时它似乎在召唤y.isCase(x)
。
Groovy 如何知道调用哪一个?Groovy 是否知道使用 .contains 方法的特定类或一组类?还是由其中一个对象上存在方法触发的行为?是否存在将 in 运算符完全更改为其他内容的情况?
Groovy 的“in”运算符在不同的情况下似乎意味着不同的东西。有时x in y
意味着y.contains(x)
有时它似乎在召唤y.isCase(x)
。
Groovy 如何知道调用哪一个?Groovy 是否知道使用 .contains 方法的特定类或一组类?还是由其中一个对象上存在方法触发的行为?是否存在将 in 运算符完全更改为其他内容的情况?
我做了一些实验,看起来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
对于 JDK 集合类,我猜它似乎只是in
基于运算符,contains()
因为isCase()
调用contains()
了这些类。
其实都是基于isCase。Groovy向 Collections 添加了一个基于 contains 方法的 isCase方法。任何带有 isCase 的类都可以与 in 一起使用。
in
是“会员运营商”。
从Groovy 3 的文档(强调我的):
8.6. 会员运营商
成员运算符 (
in
) 等效于调用isCase
方法。在 a 的上下文中List
,它等同于调用contains
,如下例所示:def list = ['Grace','Rob','Emmy'] assert ('Emmy' in list) # (1)
(1)
相当于调用list.contains('Emmy')
或list.isCase('Emmy')
因此,Groovy 总是调用isCase
,如果是List
映射到contains
.