On Vox: Записки маньяка
Dec. 16th, 2008 08:27 pmБэкграунд. Те, кто знает Ruby - пропустите.
В рубях есть такая фишка - собственно, основная - как "блоки". Каждому вызову метода можно дать как бы дополнительный параметр - блок кода. Эти блоки не являются настоящими значениями первого класса; однако, внутри метода их можно вызывать.
Метод:
class SomeClass
...
def someMethod
... # что-то тут делаем
yield # вызываем переданный блок
... # делаем что-то ещё
end
...
end
Его вызов:
someInstance = SomeClass.new
...
someInstance.someMethod {... блок кода ...}
Вот, значит. Команда yield вызовет этот самый блок кода.
Замечание: из блока кода можно сделать настоящую лямбда-функцию, так что не говорите, что что-то не так.
Дальше - больше. Переданный блок может иметь параметры - скажем, так:
someInstance.someMethod {|i j| ... if i>j then...}
Соответственно, параметры передаются yield:
yield(1,2);
Ну, и что маньяк в моём лице попытался сделать в первую очередь? Ну разумеется, что-то такое:
...
def someMethod
yield {бла-бла-бла}
end
...
someInstance.someMethod {yield}
С тем, чтобы метод вызвал переданный ему блок, в свою очередь передав этому блоку другой блок кода.
И что бы вы думали?
Не сработало.
Originally posted on migmit.vox.com