16

Groovy 的“in”运算符在不同的情况下似乎意味着不同的东西。有时x in y意味着y.contains(x)有时它似乎在召唤y.isCase(x)

Groovy 如何知道调用哪一个?Groovy 是否知道使用 .contains 方法的特定类或一组类?还是由其中一个对象上存在方法触发的行为?是否存在将 in 运算符完全更改为其他内容的情况?

4

3 回答 3

17

我做了一些实验,看起来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()了这些类。

于 2010-01-14T23:45:14.577 回答
4

其实都是基于isCase。Groovy向 Collections 添加了一个基于 contains 方法的 isCase方法。任何带有 isCase 的类都可以与 in 一起使用。

于 2010-01-21T19:23:03.460 回答
2

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.

于 2020-09-29T20:06:14.963 回答