2010-01-14 88 views
13

Groovy“in”运算符在不同情况下似乎意味着不同的事情。有时x in y表示y.contains(x),有时它似乎称为y.isCase(x)运营商中的Groovy如何工作?

Groovy如何知道要调用哪一个? Groovy知道哪些使用.contains方法的特定类或一组类?还是由一个对象上的方法的存在引发的行为?是否有任何情况下运营商变成了其他东西?

回答

15

我做了一些实验和它看起来像in运营商仅基于这表现在下面的代码

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运算符是isCase方法基于,因为isCase()对这些类别调用。

+1

好的,这是有道理的。我对“in”和isCase之间的关系感到困惑。我可以看到,现在包含使用容器作为案例标签时有意义。对in运算符重用isCase有点令人惊讶,因为它允许在String == true中出现意外的表达式,如'asdf'。 – ataylor 2010-01-15 00:05:37

+0

这是正确的,但在常规方面我很差。虽然case语句的行为并包含一个元素对集合使用相同的逻辑,但在其他情况下它们是非常不同的。例如,下面的断言不传递:在'buns'中声明'b'。这至少可以说是违反直觉的。 – 2011-04-20 13:41:54

+0

任何人都可以请总之告诉我什么是案件的意思? – 2014-11-04 12:52:49

3

它实际上都基于isCase。 Groovy增加了一个基于contains方法的isCase method to Collections。任何具有isCase的类都可以与in一起使用。