Как работает оператор Groovy в операторе?

Оператор Groovy "in" в разных случаях означает разные вещи. Иногда x in y означает y.contains(x), и иногда он вызывает вызов y.isCase(x).

Как Groovy знает, какой из них вызывать? Есть ли определенный класс или набор классов, о которых Groovy знает, для чего используется метод .contains? Или поведение, вызванное существованием метода на одном из объектов? Существуют ли случаи, когда оператор in изменяется полностью на что-то другое?

Ответы

Ответ 1

Я сделал несколько экспериментов, и похоже, что оператор in основан на методе 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, я думаю, просто кажется, что оператор in основан на contains(), потому что isCase() вызывает contains() для этих классов.

Ответ 2

На самом деле все они основаны на isCase. Groovy добавляет метод isCase для коллекций, основанный на методе contains. Любой класс с isCase можно использовать с.