Hi All,

I'm having trouble understanding the logic behind the semantics
of the break construct, specifically when used in lamdbas and methods.

The following example illustrates what to me appears to be inconsistent
logic. Is this behaviour intended? If so, can anyone shed any light on
the logic behind it.

My issue is with cases 4 and 5.
- Shouldn't case 4 behave the same as either case 1 or case 2?
- As I understand it, lambdas are meant to behave more like methods
   rather than blocks, but it case 5, methods are behaving more like
   blocks than are lambdas, and methods behave like blocks only when
   called rather than yielded.

Cheers, Wayne.

-----------------------------------------------------------------

def myiterator1(list)
     for i in list
         yield(i)
     end
end

def myiterator2(list, proc)
     for i in list
         proc.call(i)
     end
end

def bar(x)
     puts x; break; puts 'after'
end

method = Kernel.method(:bar)

lambda = Kernel.lambda { |x| puts x; break; puts 'after' }


# case 1: break causes iterator to exit (as expected)
myiterator1(1..10) { |x| puts x; break; puts 'after' }

# case 2: LocalJumpError - break from proc-closure (ok)
myiterator1(1..10, &lambda)

# case 3: LocalJumpError - break from proc-closure (ok)
myiterator1(1..10, &method)

# case 4: break causes block to exit but not iterator (why???)
myiterator2(1..10, lambda)

# case 5: break causes iterator to exit (just like a block in case 1)
myiterator2(1..10, method)