Эти три переменные очень важны, если вы решили написать DSL. Хотя в простейших случаях они указывают на один и тот же объект, они все могут отличаться друг от друга. Вас не интересовала, как работает identity в Groovy? Быть может, вы думаете, что там кроется какая-та хитрость и только создатели языка да ещё 10-20 программистов знают, как все работает. Давайте напишем, свой вариант identity и назовем его по старой памяти with.
class Sample {
def foo (){
println "foo"
}
def with (Closure s){
s.delegate = this
s ()
}
}
new Sample ().with {
foo()
}
Установив delegate для Closure, мы намекаем Groovy, где искать ненайденные методы - в объекте delegate, в данном случае в объекте Sample. Очень просто? Да.
Давайте теперь вздохнем глубоко и напишем:
class Sample {
def foo (){
println "foo"
}
}
ExpandoMetaClass.enableGlobally()
Object.metaClass.with = {Closure s->
s.delegate = delegate
s ()
}
Теперь для любого класса, не только для Sample, будет работать наш with. Опять-таки очень просто. Подробнее о втором примере в следующий раз.

Комментариев нет:
Отправить комментарий