如何在Ruby中将块传递给另一个块?

时间:2012-07-03 15:49:56

标签: ruby block

假设我有以下过程:

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

另外假设我将a传递给另一个方法,该方法随后在具有该块的另一个类上调用instance_eval,我现在如何将一个块传递到该方法的末尾,该方法在{{1 }}

例如:

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

中的a

我需要这样的东西作为我正在研究的Ruby模板系统的基础。

2 个答案:

答案 0 :(得分:5)

您无法在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()调用它。

答案 1 :(得分:0)

a=Proc.new do |b|
    puts "start"
    b.call
    puts "end"
end
def do_something(a,&b)
  AnotherClass.instance_eval { a.call(b) }
end