Groovy "в" операторе, кажется, означает разные вещи в различных случаях. Иногда x in y
средства y.contains(x)
и иногда это, кажется, звонит y.isCase(x)
.
Как Groovy знает который звонить? Существует ли конкретный класс или набор классов, которые Groovy знает о который использование .contains метод? Или поведение инициировано существованием метода на одном из объектов? Есть ли какие-либо случаи, где в операторе изменяется во что-то еще полностью?
Я проделал некоторые эксперименты, и он выглядит как в операторе
основано на методе 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, я думаю, Просто похоже на в
в в , содержит ()
, потому что iscase ()
вызовы содержит ()
для тех классов.
Это на самом деле все на основе iScase. Groovy добавляет ISCASE метод коллекций , основанный на методе содержимого. Любой класс с iScase можно использовать с помощью.