8

次のプロシージャがあると仮定します。

a = Proc.new do
    puts "start"
    yield
    puts "end"
end

aまた、後でそのブロックを使用して別のクラスを呼び出す別のメソッドに渡すと仮定instance_evalすると、 で生成されるそのメソッドの最後にブロックを渡すにはどうすればよいでしょうかa

例えば:

def do_something(a,&b)
    AnotherClass.instance_eval(&a) # how can I pass b to a here?
end

a = Proc.new do
    puts "start"
    yield
    puts "end"
end

do_something(a) do
    puts "this block is b!"
end

もちろん、出力は次のようにする必要があります。

start
this block is b!
end

セカンダリ ブロックを に渡すにはどうすればよいinstance_evalですか?

私が取り組んでいる Ruby テンプレート システムの基礎として、このようなものが必要です。

4

2 に答える 2

5

では yield を使用できませんa。むしろ、Procオブジェクトを渡す必要があります。これは新しいコードになります。

def do_something(a,&b)
    AnotherClass.instance_exec(b, &a)
end

a = Proc.new do |b|
    puts "start"
    b.call
    puts "end"
end

do_something(a) do
    puts "this block is b!"
end

yieldメソッド専用です。この新しいコードではinstance_exec、ブロックにパラメーターを渡すことができる (Ruby 1.9 の新機能) を使用しました。そのため、 Proc オブジェクトbをパラメーターとして に渡し、aで呼び出すことができますProc#call()

于 2012-07-03T16:06:03.753 に答える
0
a=Proc.new do |b|
    「開始」を置く
    b.コール
    「終わり」を置く
終わり
def do_something(a,&b)
  AnotherClass.instance_eval { a.call(b) }
終わり
于 2012-07-03T16:25:11.847 に答える