Вызовите метод как закрытие

Извините за очевидный подход, но лучший способ должен был бы сделать:

for item in my_generator:
     print item

Теперь Вы обнаружили, что генератор пуст при использовании его. Конечно, объект никогда не будет отображаться, если генератор будет пуст.

Это не может точно согласоваться с Вашим кодом, но это - то, для чего идиома генератора: итерация, поэтому возможно, Вы могли бы изменить свой подход немного или не использовать генераторы вообще.

6
задан Dónal 8 September 2009 в 17:16
поделиться

1 ответ

При преобразовании метода в замыкание с использованием нотации . & вы опускаете параметры. f. & method (6) аналогичен вызову f.method (6), который вернет 16, поэтому в вашем примере вы передаете 16 в invokeClosure, а не закрытие. Это вызывает следующее исключение, поскольку класс Integer не имеет метода вызова:

Исключение выброшено: нет сигнатуры метода: java.lang.Integer.call ()

Ниже передается указатель метода для f.method в invokeClosure и будет тем, как вы обычно используете. &.

class Foo {
  def method(def param) {
    param + 10
  }
}

def invokeClosure = {Closure closure ->
   return closure.call(6) // can leave off .call
}

def f = new Foo()
invokeClosure f.&method

Как вы отметили, следующее будет работать:

invokeClosure {f.method(6)}

Это потому, что вы передаете замыкание, которое не принимает параметров, поэтому closure.call () работает в этом случае .

8
ответ дан 10 December 2019 в 02:50
поделиться