Ruby-可能可以通过块作为参数作为实际块到另一个函数的块吗?

StackOverflow https://stackoverflow.com/questions/2468446

  •  20-09-2019
  •  | 
  •  

这就是我要做的:

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}”的行上,我试图找到另一种方法来使新实例变量run实例在块上评估。我能想到的唯一方法是将原始块istance_eval传递给不是变量或任何东西,而是像测试示例中的真实块。

有小费吗?

有帮助吗?

解决方案

是的。您可以将块传递给其他方法,通过将块变量与类似的汇编预备:

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

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

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top