На самом деле возврат здесь особенный, а не стандартное поведение. Рассмотрим:
def foo(ary)
ary.each do |e|
return true if e == 2
end
end
Этот код на самом деле имеет более одного стекового фрейма (по крайней мере для on #foo, для Array # каждый и для анонимной функции, переданной в #each). Что делает возврат: он выполняет переход к кадру стека самой внешней лексической области, в которую он вызывается (конец foo), и возвращает заданное значение. Если вы много играете с анонимными функциями, вы обнаружите, что возврат недопустим во всех контекстах, в то время как просто возвращается последнее вычисленное значение.
Поэтому я бы рекомендовал никогда не использовать return, если он вам не нужен именно по этой причине: прерывание и возврат из текущей итерации.