2013-01-05 78 views
3

我想塊傳遞給塊被instance_eval -ed這樣,如何將塊傳遞給`instance_eval`塊?

instance_eval(&block) { puts "test" } 

其中block被定義爲包含類似:

puts "Incoming message:" 
yield 

這可能嗎?我發現了一種使用光纖的方法,但我首先嚐試使用yield。看看this question,看起來這可能是不可能的,但我想確認一下。

+1

你能否解釋多一點,以你想要做什麼?這不是很清楚。另外你的例子是傳遞兩個塊到'instance_eval',這沒有任何意義。 –

+0

你想讓'yield'產生你的'{puts'test'}'塊嗎? –

+0

你是對的,它沒有意義,因爲它不是真正有效的,但我希望第二個塊被傳遞到instance_eval實際正在評估的塊,因此最終輸出將是「傳入消息:\ n測試」 。我正在尋找類似的東西,但當然是有效的。 – Max

回答

2

確實很奇怪。爲什麼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) 

執行(紅寶石1.9.2):

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