On May 4, 2007, at 11:00 PM, noreply / rubyforge.org wrote:

> As an example, please consider the following trivial and highly  
> contrived example.  A call to foo returns out of the defined lambda  
> block m, assigning the variable q and returning from foo properly,  
> when v is negative.  However, if v is positive and the iteration  
> over the range is executed, the return returns from both m and foo,  
> skipping the assignment to q and the further processing that foo  
> does to that result, and instead returns n straight out of foo.  (I  
> bet that was hard to follow)  :)
>
>
> def foo(value)
>   m = lambda do |v|
>     return "v is negative" if v < 0
>       (5...100).each do |n|
>         #This line returns from the whole method, not just from the  
> block!
>         return n if v.modulo(n).zero?
>       end
>     return false
>   end
>
>   q = m.call(value)
>   return "ANSWER: #{q.inspect}"
> end


In your example, the block associated with #each is *not* a lambda  
and so
the return is associated with the method.  A block within a lambda  
has its
own behavior with respect to 'return'--it doesn't inherit that  
behavior from
an enclosing block.

Gary Wright