#groovy #dsl
#groovy #dsl
Вопрос:
show = { println it }
square_root = { Math.sqrt(it) }
def please(action) {
[the: { what ->
[of: { n -> action(what(n)) }]
}]
}
// equivalent to: please(show).the(square_root).of(100)
please show the square_root of 100
// ==> 10.0
Я понимаю please(show)
, что возвращает объект, у которого есть вызываемый метод the(param)
, который, в свою очередь, возвращает объект, у которого есть метод of(param)
.
чего я не понимаю, так это того, как строка
please show the square_root of 100
был преобразован в карты и замыкания после please(show)
Ответ №1:
Ключевым моментом здесь является запись кода без «необязательных» вызовов и отсутствия доступа к участникам. То есть:
please(show).the(square_root).of(100)
Способ, которым это было сделано, заключается в том, чтобы связать следующий вызов, вернув карту с (по крайней
мере) ключом «в предложении», который снова имеет замыкание в качестве значения для
продолжения этой цепочки.
Итак, чтобы записать это еще более подробно (для одного звена в цепочке):
.getAt('the').call(square_root)
Комментарии:
1. Спасибо, я думаю, что начинаю понимать. Поэтому, пожалуйста, (show) возвращает карту и с помощью .getAt() из Groovy Maps (со строкой в качестве ключей по умолчанию) мы получаем значение ключа ‘the’, которое является замыканием, которое затем вызывается с помощью call()