Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/ruby/24.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby-是否可以将块作为参数作为实际块传递给另一个函数?_Ruby_Instance Eval - Fatal编程技术网

Ruby-是否可以将块作为参数作为实际块传递给另一个函数?

Ruby-是否可以将块作为参数作为实际块传递给另一个函数?,ruby,instance-eval,Ruby,Instance Eval,这就是我想做的: 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 ti

这就是我想做的:

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


有什么建议吗?

有。您可以通过在块变量前面加上一个类似于以下的符号,将块传递给另一个方法:

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

您得到“class:Object”的原因是Ruby使用词法作用域。这意味着self在
中放置“class:#{self.class}”
指的是默认上下文
main

什么???就这么简单?哈哈哈,谢谢!我在这件事上被困了好几天!:)要搜索的术语是“块参数”;但事后看来更容易:)