ОБНОВЛЕНИЕ: Поскольку в последнее время этот ответ, похоже, вызвал некоторый интерес, я хотел бы отметить, что существует обсуждение средства отслеживания проблем Ruby для удаления обсуждаемой здесь функции, а именно запретить иметь определения метода внутри тела метода .
Нет, у Ruby нет вложенных методов.
Вы можете сделать что-то вроде этого:
class Test1
def meth1
def meth2
puts "Yay"
end
meth2
end
end
Test1.new.meth1
Но это не вложенный метод. Я повторяю: Ruby не имеет вложенных методов.
Это динамическое определение метода. При запуске meth1
будет выполнено тело meth1
. Тело просто определяет метод с именем meth2
, поэтому после однократного запуска meth1
вы можете вызвать meth2
.
Но где определяется meth2
? Что ж, очевидно, что не определен как вложенный метод, поскольку в Ruby нет вложенных методов . Он определен как метод экземпляра Test1
:
Test1.new.meth2
# Yay
Кроме того, он, очевидно, будет переопределяться при каждом запуске meth1
:
Test1.new.meth1
# Yay
Test1.new.meth1
# test1.rb:3: warning: method redefined; discarding old meth2
# test1.rb:3: warning: previous definition of meth2 was here
# Yay
Короче говоря: нет, Ruby не не поддерживает вложенные методы.
Обратите внимание, что в Ruby тела методов не могут быть замыканиями, а только блочными. Это в значительной степени исключает основной вариант использования для вложенных методов, поскольку даже , если Ruby поддерживает вложенные методы, вы не можете использовать переменные внешнего метода во вложенном методе.
ОБНОВЛЕНИЕ ПРОДОЛЖАЕТСЯ: на этапе позже этот синтаксис может быть повторно использован для добавления вложенных методов в Ruby, который будет вести себя так, как я описал: они будут ограничены их содержащим методом, то есть невидимые и недоступные вне тела, содержащего метод. И, возможно, они будут иметь доступ к лексической области действия своего содержащего метода. Однако, если вы прочитаете обсуждение, которое я связал выше, вы заметите, что matz сильно против вложенных методов (но все же для удаления определений вложенных методов).