2010-01-14 3 views
13

Groovy "in"연산자는 다른 경우를 의미하는 것으로 보입니다. 경우에 따라 x in yy.contains(x)을 의미하고 때로는 y.isCase(x)을 호출하는 것으로 보입니다.그루비 연산자는 어떻게 작동합니까?

Groovy는 어떤 것을 호출해야하는지 어떻게 알 수 있습니까? Groovy가 .contains 메소드를 사용하는 특정 클래스 또는 클래스 집합을 알고 있습니까? 아니면 개체 중 하나에 메서드가 존재하여 트리거되는 동작입니까? in 연산자가 완전히 다른 것으로 변경되는 경우가 있습니까?

답변

15

나는 몇 가지 실험을했고, in 연산자는 다음과 같은 코드 JDK 컬렉션 클래스에 대한

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 

나는 in 연산자처럼 그냥 보인다 추측에 의해 입증 단지로 isCase 방법에 따라 것 같습니다 을 기반으로하므로 isCase()은 해당 클래스에 대해 을 호출합니다.

+1

좋습니다. "in"과 isCase의 관계에 대해 혼란스러워했습니다. 지금은 컨테이너를 사례 레이블로 사용할 때 의미가 있음을 알 수 있습니다. in 연산자에 대한 isCase 재사용은 다소 놀랍습니다. String == true에서 'asdf'와 같은 예상치 못한 표현식을 허용하기 때문입니다. – ataylor

+0

이것은 맞지만 Groovy 측에서는 열악합니다. 사례 문 동작과 요소를 포함하는 것은 컬렉션과 동일한 로직을 사용하지만 다른 상황에서는 매우 다릅니다. 예를 들어 다음과 같은 어설 션은 통과하지 않습니다. 'buns'에 'b'를 지정하십시오. 이것은 말하기에 직관적이지 못합니다. –

+0

누구나 간단하게 무엇을 말해 줄 수 있습니까? –

3

사실 isCase를 기반으로합니다. Groovy는 contains 메소드를 기반으로 isCase method to Collections을 추가합니다. inCase가있는 클래스는 in에서 사용할 수 있습니다.