I think the broken loop can be done in the old-fashioned loop style with break or something like this:
n = 5 [1,2,3,4,5,6,7].take_while { |e| n -= 1; n >= 0 && e < 7 }
In a functional language, this will be recursion, but without TCO it does not make much sense in Ruby.
UPDATE
take_while was a dumb idea, as dbenhur pointed out, so I don't know anything better than a loop.
source share