Mar*_*lly 6 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 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}" }
Run Code Online (Sandbox Code Playgroud)
在它说"instance.instance_eval {block.call}"的行上,我试图找到另一种方法使新的实例变量在块上运行实例eval.我能想到的唯一方法是将instance_eval传递给原始块,而不是作为变量或任何东西传递,而是像测试示例中那样作为实际块传递.
有小费吗?
是.您可以通过在块变量前添加一个&符号来将块传递给另一个方法,如下所示:
def foo &blk
# now, blk is a variable bound to a block object
bar &blk
end
Run Code Online (Sandbox Code Playgroud)
你得到"class:Object"的原因是Ruby使用词法作用域.这意味着self in puts "class: #{self.class}"指的是main默认上下文.
| 归档时间: |
|
| 查看次数: |
1812 次 |
| 最近记录: |