2010-01-14 36 views
13

Groovy "in" operatörü farklı durumlarda farklı şeyler anlamına gelir. Bazen x in y, y.contains(x) anlamına gelir ve bazen y.isCase(x)'u arar.Operatördeki Groovy nasıl çalışır?

Groovy hangisini arayacağını biliyor? Groovy'nin .contains yöntemini kullanan hakkında bildiği belirli bir sınıf veya sınıf grubu var mı? Ya da nesnelerden birindeki bir yöntemin varlığı tarafından tetiklenen davranış mıdır? Operatörün tamamen başka bir şeye dönüştüğü durumlar var mı?

cevap

15

Bazı deneyler yaptı ve in operatör aşağıdaki kodla JDK toplama sınıfları iç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 

Ben in operatörüdür gibi sadece görünüyor tahmin gösterdiği yalnızca isCase yöntemine dayanmaktadır gibi görünüyor temel alınarak, isCase() bu sınıflar için 'u çağırır.

+1

Tamam ile kullanılabilir, bu mantıklı. "In" ve isCase arasındaki ilişki hakkında kafam karışmıştı. Şimdi bir kapsayıcıyı bir kasa etiketi olarak kullanırken anlamlıdır. Reuse isCase in operatörü biraz şaşırtıcıdır, çünkü String == true'da 'asdf' gibi beklenmedik ifadelere izin verir. – ataylor

+0

Bu doğru, ancak groovy bölümünde imo fakir. Dava beyanı davranışı ve bir elementi içeren koleksiyonlar aynı mantığı koleksiyonlarla kullanırken, diğer durumlarda çok farklıdırlar. Örneğin, aşağıdaki iddialar geçmez: 'çörekler' içinde 'b' ibaresi. Bu en az söylemek mantıklıdır. –

+0

Lütfen herkesin ne demek olduğunu kısaca anlatır mısınız? –