Я хочу реализовать «активный» флаг для правил в моем DSL. Вот как я хотел, чтобы это выглядело как:Groovy DSL: настройка свойств в закрытии
Shipping("Standard") {
active: true
description: "some text"
rules {
... define rules here
}
}
Вот как я получил все работает следующие несколько учебников:
Script dslScript = new GroovyShell().parse(new File("Standard"))
dslScript.metaClass.Shipping = { String name, Closure cl ->
ShippingDelegate delegate = new ShippingDelegate()
delegate.name = name
cl.delegate = delegate
cl.setResolveStrategy Closure.DELEGATE_FIRST
cl()
}
dslScript.run()
ShippingDelegate прост:
class ShippingDelegate {
String name
void rules(Closure cl) {
... do stuff here
}
}
Это все прекрасно работает без жалоб но как я могу получить доступ к «активному» или «описанию»?
Что вообще делает этот синтаксис? Это похоже на присвоение карты, но ее нет. Или компилятор groovy относится к нему как к неполному тернарному оператору?
Спасибо за это! Я знал только об использовании ExpandoMetaClass для присоединения глобальных функций к среде Script, но это расширение абстрактного класса намного проще и понятно. – NagyI