【问题标题】:Ruby - Possible to pass a block as a param as an actual block to another function?Ruby - 可以将块作为参数作为实际块传递给另一个函数吗?
【发布时间】:2011-01-28 22:24:42
【问题描述】:

这就是我想要做的:

def call_block(in_class = "String", &block)
    instance = eval("#{in_class}.new")
    puts "instance class: #{instance.class}"
    instance.instance_eval{ block.call }
end


# --- TEST EXAMPLE ---
# This outputs "class: String" every time
"sdlkfj".instance_eval {  puts "class: #{self.class}" }

# This will only output "class: Object" every time
# I'm trying to get this to output "class: String" though
call_block("String") { puts "class: #{self.class}" }

在显示“instance.instance_eval{ block.call }”的那一行,我试图找到另一种方法来让新实例变量在块上运行实例 eval。我能想到的唯一方法是传递 instance_eval 原始块,而不是作为变量或任何东西,而是作为测试示例中的真实块。

有什么建议吗?

【问题讨论】:

    标签: ruby instance-eval


    【解决方案1】:

    是的。您可以通过在块变量前面加上一个&符号来将块传递给其他方法,如下所示:

    def foo &blk
      # now, blk is a variable bound to a block object
      bar &blk
    end
    

    您获得“类:对象”的原因是 Ruby 使用了词法范围。这意味着 puts "class: #{self.class}" 中的 self 指的是默认上下文 main

    【讨论】:

    • 什么???就这么简单?哈哈哈,谢谢!我被困在这个上面好几天了! :)
    • 要搜索的词是“块参数”;事后看来更容易:)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-02-27
    • 1970-01-01
    • 1970-01-01
    • 2013-11-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多