Как следует из названия, если я определяю замыкание, которое принимает один аргумент, могу ли я передать его с аргументом для выполнения.
Например:
def print = { String NAME -> println "$NAME"}
А затем передать его другой функции для выполнения следующим образом:
otherFunction(print("Jeff"))
Если другая функция имеет сигнатуру:
otherFunction(Closure clos):
clos.call()
Спасибо!
Я понял, где я ошибся, мне нужно, чтобы моя функция возвращала замыкание с моей интерполированной переменной.
Например:
def Closure print (String NAME){
{name -> println name}
}
Затем сделайте вызов, чтобы сгенерировать пользовательское закрытие и передать это:
otherFunction(print("Jeff"))
Ответил на мой вопрос, пожалуйста, закройте.
Проблема с вызовом otherFunction(print("Jeff")) заключается в том, что вы передаете ему возвращаемое значение print("Jeff"), которое равно null, потому что println ничего не возвращает (void функция).
Вместо этого вы должны передать объект закрытия, который вызывается с помощью метода call(). Вы сами это поняли, но мой подход более прямолинеен. Другим решением было бы использовать функциональную композицию:
def print = { println it }
def otherFunction(Closure clos) {
clos.call()
}
// this is equivalent with otherFunction(null)
//otherFunction( print("Jeff") )
// pass a closure object
otherFunction { print("Jeff") }
// using function composition
def printJeff = print << { "Jeff" }
printJeff()
Спасибо за объяснение, я думаю, что я перепишу свое решение, используя ваш метод. Ответ принят.
SO рекомендует добавлять (а также принимать) свой собственный ответ. Не нужно его закрывать.