2013-07-23 116 views
4

我可以在Proc中生成一個塊嗎?考慮下面這個例子:我可以評估Proc中的塊嗎?

a = Proc.new do 
    yield 
end 

a.call do 
    puts "x" 
end 

我試圖做到的,是打印x,但與紅寶石2.0解釋這引起了LocalJumpError: no block given (yield)

回答

4

不可以,因爲您創建的Proc是獨立的yield - 也就是說,它的yield在其上下文中沒有任何塊。儘管可以使用指定的參數調用proc,並將參數傳遞給proc,但yield不能根據指定的參數工作;它執行proc閉包內的塊。 proc的關閉是預定義的;它不會被修改,只是因爲稍後使用塊來調用它。

因此,它只是將'yield'直接輸入到irb(不在任何方法定義中),它返回LocalJumpError: no block given (yield)錯誤。

4

@Rebitzele解釋爲什麼你的代碼不能工作:yield關鍵字調用已傳遞給方法的匿名塊速記符號,而在這種情況下,不是連的方法。

不過你當然可以給塊一個名稱,然後調用它,你會調用任何其它可調用對象:

a = ->&block { block.() } 

a.() do puts 'x' end 
# x 
+0

仍在試圖弄清楚是怎麼回事,但是這似乎並沒有爲我工作:'obj.instance_eval {def wrap(&block); a = - &block {block。()}; a。(){puts'goodbye'};結束}; obj.wrap {puts'hello'; yield}'只會打印'再見' –

相關問題