ruby - 如何在 Ruby 中将一个 block 传递给另一个 block ?

标签 ruby block

假设我有以下过程:

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

还假设我将 a 传递给另一个方法,该方法随后使用该 block 在另一个类上调用 instance_eval,我现在如何将一个 block 传递到该方法的末尾在 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

如何将辅助 block 传递给 instance_eval 中的 a?

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

最佳答案

您不能在 a 中使用 yield。相反,您必须传递一个 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 中的新功能),它允许您将参数传递给 block 。因此,我们可以将 Proc 对象 b 作为参数传递给 a,后者可以使用 Proc#call() 调用它。

关于ruby - 如何在 Ruby 中将一个 block 传递给另一个 block ?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11314622/

相关文章:

ruby-on-rails - Ruby on Rails & Prawn PDF - 创建客户名单

ios - Completion^ block 未在 UIView 动画中调用

ruby-on-rails - Windows 7 上的 Docker Compose : Could not locate Gemfile or . bundle /目录

Ruby 服务器配置工具

magento - 覆盖\app\code\core\Mage\Core\Block\Messages.php

css - 显示与 block div 列表的第一个 div 内联的 div

python - 如何在 TextMate 中为 Python 注释启用 block 折叠?

Ruby strptime 不会在参数为 '25/01/2017' 的 %Y/%m/%d 上抛出 ArgumentError

ruby-on-rails - ActiveRecord 联接获取子对象而不是父对象

ruby-on-rails - 如何从 Rails 中的多个表关联中获取数据?