From: William James Date: 2008-11-05T04:18:31+09:00 Subject: Re: Passing a block to a block Brian Candler wrote: > I notice that if you pass a block to a block, you can't use 'yield' to > yield to that block: > > $ cat yield_in_block.rb > foo = lambda { |e| puts e } > blk = lambda { |e| yield e } > blk.call(123, &foo) > blk is not a block. It is a Proc object or closure. (Note that it isn't a Lambda object. Lambda is for Lisp weenies.) > $ ruby yield_in_block.rb > yield_in_block.rb:2: no block given (LocalJumpError) > from yield_in_block.rb:3 > $ ruby19 yield_in_block.rb > yield_in_block.rb:2:in `block in
': no block given (yield) > (LocalJumpError) > from yield_in_block.rb:3:in `call' > from yield_in_block.rb:3:in `
' > > What's the reason for this? Does 'yield' only invoke the top-level block > passed into a method? > > ruby1.9 is happy but only if I explicitly reference the block to yield. > > foo = lambda { |e| puts e } > blk = lambda { |e,&y| y[e] } > blk.call(123, &foo) foo = proc{|x| puts x } ==># bar = proc{|x,prc| prc[x] } ==># bar[ 88, foo ] 88 ==>nil