2014-09-17 2 views
6

Я прочитал некоторый метод наложения спектров, как это:В чем разница между методом псевдонима и символом псевдонима?

alias :original_method :method 

Это выглядит как символы в рубин для меня. В чем разница, если я напечатал этот псевдоним следующим образом:

alias original_method method 

Будет ли результат другим?

+2

Вы можете или не знать, но только для информации. Здесь следует отметить, что 'alias' - это не метод, а ключевое слово. Если бы это был метод, то второй не работал бы. – sawa

+4

@sawa первый из них не работает ни из-за отсутствия ',' между аргументами – Stefan

+0

@Stefan Вы правы. Я пропустил это. – sawa

ответ

7

Там, кажется, не будет разницы, от documentation:

alias ключевое слово наиболее часто используется для методов псевдонимов. Когда альясинга метода, который вы можете использовать либо его название или символ:

alias new_name old_name 
alias :new_name :old_name 
+0

Хм, интересно. Я бы предпочел, чтобы предыдущий синтаксис выполнял оба метода и использовал их возвращаемое значение. Однако, поскольку псевдоним - это не метод, а ключевое слово, имеет смысл вести себя по-другому. Если вы пытаетесь использовать имена методов вместо символов для 'alias_method', оба метода выполняются. – BroiSatse

+1

Кроме того, если 'alias' был методом, то первая строка будет означать' self.alias (self.new_name (self.old_name())), а не 'self.alias (self.new_name(), self.old_name()) '. –

1

Помимо того, что один метод (и так оцениваете свои аргументы, как и любой метод делает), вы должны покинуть общее пользование чтобы найти разницу.

Например, если вы делаете

class Foo 
    def old_name 
    'foo' 
    end 

    def self.rename_name 
    alias_method :new_name, :old_name 
    end 
end 

class Bar < Foo 
    def new_name 
    'bar' 
    end 
end 

Bar.rename_name 

Тогда Bar имеет свой метод new_name перезаписаны, и Foo нетронутым

Как всегда, если вы изменить это использовать alias т.е.

class Foo 
    def old_name 
    'foo' 
    end 

    def self.rename_name 
    alias :new_name :old_name 
    end 
end 

class Bar < Foo 
    def new_name 
    'bar' 
    end 
end 

Bar.rename_name 

Затем класс Bar не изменяется, и Foo получает метод ca lled: new_name. Это не похоже на разницу между использованием define_method и определением метода с def.

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

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