William James
11/4/2008 7:17:00 PM
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 <main>': no block given (yield)
> (LocalJumpError)
> from yield_in_block.rb:3:in `call'
> from yield_in_block.rb:3:in `<main>'
>
> 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 }
==>#<Proc:0x02b2ae60@(irb):1>
bar = proc{|x,prc| prc[x] }
==>#<Proc:0x02b24ac4@(irb):2>
bar[ 88, foo ]
88
==>nil