IRB всегда отображает результат вызова inspect
на значение последнего выражения, которое было оценено. Не имеет значения, является ли это выражение буквенным выражением, условным выражением, отправкой сообщения, выражением определения класса или выражением определения метода.
Все возвращает значение в Ruby, т.е. все является выражением, нет такого понятия, как заявление в Ruby.
В прошлом возвращаемое значение выражения определения метода не определено. Большинство реализаций Ruby просто вернули nil
из выражения определения метода, но Rubinius, например, вернул объект CompiledMethod
для метода, который был определен.
С Ruby 2.1, the return value of a method definition expression was standardized to be the Symbol
corresponding to the method's name. Это позволяет использовать выражение определения метода в качестве аргумента в методах, которые ожидают имя метода в качестве аргумента.
Некоторые примеры:
# Before Ruby 2.0:
def foo; end
private :foo
# After Ruby 2.0:
private def foo; end # similar for `protected`, `public`, `module_function`
# Before Ruby 2.0:
def map; end
alias_method :collect, :map
# After Ruby 2.0:
alias_method :collect, def map; end
На личной ноте, я предпочел бы выражение определения метода для оценки к UnboundMethod
объекта, соответствующего этому способу, а также методы, как public
, private
, protected
, alias_method
, module_function
и т. д., должны быть изменены, чтобы принять UnboundMethod
с в дополнение к Symbol
с и String
с.
Я думаю, что это 2.1, а не 2.0. – sawa
@sawa: Вы правы: https://bugs.ruby-lang.org/issues/3753 Обновлено, спасибо! –
Сначала я согласился с вашей идеей о объектах UnboundMethod, но затем я подумал о методах 'attr _...' и ключевом слове 'alias', которые находятся в подобном ключе, но не могут быть предназначены для принятия объектов UnboundMethod. Если некоторые из этих методов принимают объекты UnboundMethod, а некоторые принимают только символы, это будет путать. ter all, похоже, что символы являются наиболее надежным способом ссылаться на имена методов. – sawa