воскресенье, 23 марта 2008 г.

delegate, owner и this (часть 1)

Эти три переменные очень важны, если вы решили написать 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. Опять-таки очень просто. Подробнее о втором примере в следующий раз.

Комментариев нет: