Я пересекаю граф объектов и хочу передать ему блок, который будет выполняться на каждом узле структуры из метода - давайте назовем visit .
Вверху я собираюсь позвонить с помощью блока, и я хочу делегировать начальный вызов для посещения корневого объекта для посещения других объектов. Я могу распаковать блок в процесс локально, используя & last_parameter_name - но как мне превратить процесс обратно в блок при моем делегированном вызове?
Вот упрощенный пример, когда я вызываю first (...) и хочу передать блок моему вызову second (...)
def second(&block) # ... ? ...
block.call(72)
end
def first(&block)
puts block.class # okay - now I have the Proc version
puts 'pre-doit'
block.call(42)
puts 'post-doit'
second( ... ? ...) # how do I pass the block through here?
end
first {|x| puts x*x}
Примечание: мне нужно иметь одинаковые соглашения для first () и second () здесь, т. Е. Они должны использовать одни и те же вещи.
Прочитав и попробовав ответы, я нашел более полный рабочий пример:
class X
def visit(&x)
x.call(50)
end
end
class Y < X
def visit(&x)
x.call(100)
X.new.visit(&x)
end
end
Y.new.visit {|x| puts x*x}