2013-10-01 28 views
7

我想知道是否有可能將一個塊傳遞給Proc。簡單地傳遞一個塊Proc.call不起作用:我可以通過一個塊到Proc嗎?

foo = Proc.new { 
    yield 
} 

foo.call { 
    puts "test" 
} 

結果:

LocalJumpError: no block given (yield)

與lambda表達式同樣的情況。然而,這確實有方法的對象工作:在

class Foo 
    def bar 
    yield 
    end 
end 

bar = Foo.new.method :bar 

bar.call { puts "Success!" } 

結果:

Success!

奇怪的是,它仍然方法對象轉換爲一個進程後,工作

bar.to_proc.call { puts "Success!" } 

結果於:

Success!

那麼從一個塊創建的Proc如何不接受塊,但是最初是一種方法的Proc呢?是否有可能從接受塊的塊創建Procs?

+1

可能重複[可以評估Proc中的塊嗎?](http://stackoverflow.com/questions/17818160/can-i-evaluate-a-block-inside-a-proc) –

+0

仍然是開放的相關的問題對我來說:可以從產生塊的方法產生嗎? –

回答

5

Procs無法接受塊作爲隱含參數(您嘗試的格式)。 proc 可以接收其他proc對象作爲參數,顯式地或使用&參數。例如:

a = Proc.new do |&block| 
    block.call 
end 

a.call() {puts "hi"} 

yield是一種位laguage水平魔法只能在一個方法的上下文中。

+2

你的意思是* blocks *不能接受其他塊作爲隱式參數嗎?因爲正如我在我的問題中所演示的那樣,如果將procs從方法轉換爲proc,它們可以*。 – Hubro

+0

@Codemonkey:我很確定太proc創建一個&參數。 – Linuxios

+0

嗯有趣。非常有幫助,謝謝! –

相關問題