2014-09-17 17 views
6

czytam niektóre metody aliasingu takiego:Jaka jest różnica między metodą aliasu a symbolem aliasu?

alias :original_method :method 

który wygląda jak symbole w Ruby dla mnie. Jaka jest różnica, gdy wpisałem taki alias:

alias original_method method 

Czy wynik będzie inny?

+2

Możesz, ale nie wiesz, ale tylko dla twoich informacji. Należy tutaj zwrócić uwagę na to, że 'alias' nie jest metodą, ale jest słowem kluczowym. Gdyby była to metoda, druga nie działałaby. – sawa

+4

@sawa pierwszy nie działałby z powodu brakujących ',' pomiędzy argumentami – Stefan

+0

@Stefan Masz rację. Tęsknie za tym. – sawa

Odpowiedz

7

Nie wydaje się być różnica, z documentation:

alias Hasło jest najczęściej stosowany do metod aliasu. Kiedy aliasing metodę można użyć jej nazwę lub symbol:

alias new_name old_name 
alias :new_name :old_name 
+0

Hmm, Interesujące. Raczej się spodziewałbym, że poprzednia składnia wykona obie metody i użyje ich zwróconej wartości. Ponieważ jednak alias nie jest metodą, ale słowem kluczowym, sensownie zachowuje się inaczej. Jeśli spróbujesz użyć nazw metod zamiast symboli dla 'alias_method', obie metody są wykonywane. – BroiSatse

+1

Również, jeśli 'alias' był metodą, to pierwsza linia oznaczałaby' self.alias (self.new_name (self.old_name())), a nie 'self.alias (self.new_name(), self.old_name()) '. –

1

poza faktem, że jest to metoda (a więc ocenia swoje argumenty, jak każda metoda robi) masz do opuszczenia wspólnego korzystania przypadki, aby znaleźć różnicę.

Na przykład, jeśli nie

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 

Następnie Bar jest jego metoda nowa_nazwa nadpisane, a Foo jest nietknięty

Jak zawsze, jeśli to zmienić, aby korzystać alias tj

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 

Następnie klasa Bar pozostaje niezmieniona, a Foo zyskuje metodę ca lled: nowa_nazwa. Nie różni się to od różnicy między używaniem define_method a definiowaniem metody za pomocą def.

W jednym przypadku zakres jest czysto leksykalny: położenie linii wywołującej alias całkowicie określa, co się dzieje, podczas gdy w drugim przypadku jest to wartość self, gdy ruby ​​ocenia ten fragment kodu.

Powiązane problemy