2014-10-06 5 views

ответ

8

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

Я думаю, что это 2.1, а не 2.0. – sawa

+0

@sawa: Вы правы: https://bugs.ruby-lang.org/issues/3753 Обновлено, спасибо! –

+0

Сначала я согласился с вашей идеей о объектах UnboundMethod, но затем я подумал о методах 'attr _...' и ключевом слове 'alias', которые находятся в подобном ключе, но не могут быть предназначены для принятия объектов UnboundMethod. Если некоторые из этих методов принимают объекты UnboundMethod, а некоторые принимают только символы, это будет путать. ter all, похоже, что символы являются наиболее надежным способом ссылаться на имена методов. – sawa

0

IRB отношения стандартного рубин «результат последнего выполненного оператора возвращаются из метода.» Представьте код:

def a 
    def b 
    # do stuff 
    end 
end 

Что является результатом выполнения этого код? Из этого следует:

a 
# => :b 
a.class 
# => Symbol < Object 

При этом IRB выполняет определение метода и возвращает/распечатывает его результат. Это, по-видимому, пример Symbol.

4

Человек, который proposed это имел в виду использование так:

private def foo 
    ... 
end 
protected def bar 
    ... 
end 

методы, такие как public, private, protected символы взять в качестве аргументов. Дело в том, чтобы использовать этот синтаксис.

+0

Является ли это документированным где угодно? – Stefan

+1

@Stefan Я не могу найти в RDoc. Им следует написать об этом. – sawa

+0

@sawa этот синтаксис не _beautiful_ .. Раньше один был _beautiful_ .. :-( –

2

Весь метод defs возвращает символы в Ruby> = 2.1 (а не только в IRB).

Например:

class Foo 
    p def bar; end 
end 
# => prints :bar 

Почему это интересно?

Возможно, вы заметили, что существует множество методов, особенно методов уровня класса, которые принимают символическое имя другого метода в качестве аргумента. Вы можете быть знакомы с before_filter в контроллерах Rails. Так как метод DEFS возвращают символы, вы могли бы потенциально сделать это:

class MyController < ApplicationController 
    before_filter def my_filter 
    # do stuff 
    end 
end 
+1

вместо 'puts'' '' print'': bar' – Stefan

+0

Thnx, обновленный, чтобы отразить это. – Jesper

Смежные вопросы