I've searched quite a bit on the web and through "Programming Ruby - the
Pragmatic Programmer's Guide" and I can't find a satisfactory answer to
the question:
Can a lambda or Proc object yield a value to a block?
For example when I try this
yieldArg = lambda {|arg| yield arg}
yieldArg.call(23) {|y| puts("y="+y.to_s)}
in Interactive Ruby I get
"LocalJumpError: no block given"
So I try
yieldArg = lambda {|arg| puts "no block given" unless block_given? ;
yield arg}
to print some indication of whether the block really has been "given"
and I get
no block given
LocalJumpError: no block given
So then I try to wrap the block in a lambda and pass it as a param
putsY = lambda {|y| puts("y="+y.to_s)}
yieldArg.call(23) {|y| puts("y="+y.to_s)}
yieldArg.call(23, &putsY)
but with the same negative result.
So can a lambda or Proc object yield a value to a block? If so, how is
it done?
Thanks in advance.
Interactive Ruby session shown below.
irb(main):001:0> yieldArg = lambda {|arg| yield arg}
=> #<Proc:0x02dfebf0@(irb):1>
irb(main):002:0> yieldArg.call(23) {|y| puts("y="+y.to_s)}
LocalJumpError: no block given
from (irb):1
from (irb):2:in `call'
from (irb):2
irb(main):003:0> yieldArg = lambda {|arg| puts "no block given" unless
block_given? ; yield arg}
=> #<Proc:0x02df58e8@(irb):3>
irb(main):004:0> yieldArg.call(23) {|y| puts("y="+y.to_s)}
no block given
LocalJumpError: no block given
from (irb):3
from (irb):4:in `call'
from (irb):4
irb(main):005:0> putsY = lambda {|y| puts("y="+y.to_s)}
=> #<Proc:0x02dede2c@(irb):5>
irb(main):006:0> yieldArg.call(23, &putsY)
no block given
LocalJumpError: no block given
from (irb):3
from (irb):6:in `call'
from (irb):6
irb(main):007:0>
···
--
Posted via http://www.ruby-forum.com/.