From: timr Date: 2010-11-15T15:55:15+09:00 Subject: Re: Is it possible to break a loop from within an internal lambda function? On Nov 14, 4:46 am, w_a_x_man wrote: > On Nov 14, 2:54 am, timr wrote: > > > > > > > > > > > This code works because 'exit' within the lambda within the block > > stops the loop. However, I don't want to stop the program. I need to > > use break rather than exit. But break won't work within that lambda-- > > the loop doesn't stop. I can of course reorganize the statement so > > that it isn't a terse one-liner, and get it to work. But I would like > > to be able to break the loop from within that lambda function if it is > > possible.  Somehow, I guess I need to make that break have a binding > > to the method. Any ideas?!? > > > def solve_by_iter > >   counter = 1 > >   loop do > >     yield counter > >     counter += 1 > >   end > > end > > solve_by_iter { |test|  lambda{puts test; exit}.call if (1..6).all?{| > > num| test%num == (num-1)} } > > #I want to use: solve_by_iter { |test|  lambda{puts test; break}.call > > if (1..6).all?{|num| test%num == (num-1)} } > > solve_by_iter{|test| >   if (1..6).all?{|num| test % num == num - 1 } >     puts test >     break >   end > > } > > solve_by_iter{|test| >   (1..6).all?{|num| test%num == num-1} and (puts test; break) > That is also a clever solution. It uses 'and' for its ability control whether a second statement should be evaluated rather than its boolean sense. And I hadn't seen parentheses used to create multiline statements like this before. That is the only reason I had been using lambda before--to get a block of code with more than one line to be executed as a single unit. Similarly, break() is useful as previously suggested. The break() also removes the need for a lambda statement. Combining solutions, and using the if statement rather than 'and' which in my mind is slightly easier to read, how about this (w/ slight refactoring of variable names): def solve_by_iter counter = 1 loop do yield(counter) counter+=1 end end solve_by_iter{|numer| (puts numer; break) if (1..6).all?{|denom| numer %denom == denom-1}} Thanks guys, I learned a lot from your responses to this post. Tim