私はオブジェクト グラフをトラバースしていて、メソッドから構造の各ノードで実行されるブロックを渡したいと考えています。
上部では、ブロックを使用して呼び出しを行います。ルート オブジェクトを訪問するための最初の呼び出しを、他のオブジェクトを訪問するように委任したいと考えています。&last_parameter_name を使用してローカルでブロックを proc にアンパックできますが、委譲された呼び出しで proc をブロックに戻すにはどうすればよいですか?
これは、 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}