or better dont,
All you need to know is that lambda and Proc::new behave as they are
designed to behave, therefore the behavior you encountered is not a
bug but a feature as surprising as that comes to most of us ;). IIRC
this will change in 1.9
To better understand what really happens just run this code:
def a blk
b blk
puts :in_a
end
proc is now an alias for Proc.new instead of lambda. But what other
changes are in the pipeline?
BTW I agree that this is a feature, not a bug. But it's not obvious to
the newcomer that there are two, rather different, closure-like objects:
- lambda is standalone. A 'return' returns from the lambda.
- Proc.new / block is created within the context of a method. A 'return'
returns from that method. If the method has already terminated, then
'return' makes no sense and causes an error.
The first is what Lisp programmers expect. The second is what makes it
possible to write
def calculate_something(foo)
foo.each do |params|
...
return val if cond
end
end