2010-01-14 71 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一起使用。