@ coreyward ответ хороший, но есть еще один прием, который вы можете использовать, чтобы ограничить область действия рекурсивной функции с помощью лямбды.
def foo
...
bar = lambda do |arg|
...
bar.call(...)
...
end
bar.call(...)
...
end
Поскольку bar имеет лексическую область действия внутри foo, никакой другой метод не можетвидеть это или называть это, но лямбда, на которую ссылается бар, может видеть бар, так как он закрывается над лексической областью, где он определен.