Может кто-нибудь объяснить пример Groovy command chain dsl в документации… текст был разобран на карты и замыкания

#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()