如何将块传递给`instance_eval`-ed块?

时间:2013-01-05 01:34:08

标签: ruby block

我想将一个块传递给instance_eval的块 - 就像这样,

instance_eval(&block) { puts "test" }

其中block被定义为包含以下内容:

puts "Incoming message:"
yield

这可能吗?我发现了一种用纤维做这个的方法,但我首先尝试使用yield。看this question,看起来这可能是不可能的,但我想确认一下。

1 个答案:

答案 0 :(得分:4)

确实,这很奇怪。为什么instance_eval?它通常用于改变自我,并在接收者的背景下进行评估。

cat = String.new('weird cat')

block1 = lambda do |obj, block|
    puts "Incoming message for #{obj}:"
    block.call
end

block2 = Proc.new { puts "test" }

block3 = lambda {|obj| block1.call(obj, block2)}

cat.instance_eval(&block3)

执行(Ruby 1.9.2):

$ ruby -w t2.rb 
Incoming message for weird cat:
test