0

私はオブジェクト グラフをトラバースしていて、メソッドから構造の各ノードで実行されるブロックを渡したいと考えています

上部では、ブロックを使用して呼び出しを行います。ルート オブジェクトを訪問するための最初の呼び出しを、他のオブジェクトを訪問するように委任したいと考えています。&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}
4

3 に答える 3

6

私があなたを正しく理解していれば、

second &block
于 2011-04-01T19:00:30.533 に答える
1

yieldを使用する場合、この明示的なブロックの受け渡しは必ずしも必要ではありません。

def first( &block )
  puts block.class     # okay - now I have the Proc version
  puts 'pre-doit'
  yield 42
  puts 'post-doit'
  second( &block ) #the only reason the &block argument is needed. yield 42 can do without.
end

def second #no block argument here, works all the same 
  yield 72
end

first {|x| puts x*x}
于 2011-04-01T21:29:25.843 に答える
0

second を呼び出して、ブロック変数 (この場合は Proc) を渡すだけです。

second block
于 2011-04-01T19:05:15.633 に答える