Dec. 16th, 2008

migmit: (Default)

Бэкграунд. Те, кто знает 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