3

instance_evalこのように-edされたブロックにブロックを渡したいのですが、

instance_eval(&block) { puts "test" }

whereblockは、次のようなものを含むものとして定義されています。

puts "Incoming message:"
yield

これは可能ですか?ファイバーでこれを行う方法を発見しましたが、最初に使用しようとしていますyieldこの質問を見ると、これは不可能のように見えますが、確認したかったのです。

4

1 に答える 1

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
于 2013-01-05T03:06:32.997 に答える