2013-02-28 12 views
46

wiem, że mogę wykonać następujące czynności, a to tylko 3 linie:Czy istnieje prostsza (jednolinijkowa) składnia do aliasów jednej metody klasy?

class << self 
    alias :generate :new 
end 

Ale z ciekawości, czy istnieje prostszy sposób (bez średnikami), takich jak:

class_alias :generate, :new 
+5

Ciekawostka: 'def self.generate; Nowy; end' i 'class_alias: generate,: new' mają tę samą liczbę znaków. –

+0

@AmitKumarGupta To oszustwo, ponieważ 'def self.generate; Nowy; end' dodaje nadmiarowe wywołanie na stosie (nie ma to znaczenia, ale jest tak dokładne, jak to tylko możliwe). – mudasobwa

+2

@AmitKumarGupta Nie działa również, jeśli potrzebujesz 'new' do podjęcia jakichkolwiek argumentów. – Ajedi32

Odpowiedz

60

Od Ruby 1.9 można użyć metody singleton_class, aby uzyskać dostęp do obiektu singleton klasy. W ten sposób można również uzyskać dostęp do metody alias_method. Sama metoda jest prywatna, więc musisz wywołać ją pod numerem send. Tutaj jest jeden liner:

singleton_class.send(:alias_method, :generate, :new) 

Należy pamiętać jednak, że alias nie zadziała tutaj.

+0

Mała korekcja - nie ma potrzeby przedrostka z 'self. ' – jaustin

+0

@jaustin Dzięki! Nie zdawałem sobie sprawy, przecież jest to zdefiniowane w 'Object' –

+0

Świetne rozwiązanie! – Alexander

3

nie wiem wierzę, że istnieje jakaś wersja specyficzna dla klasy: alias. Zwykle używam go tak, jak wcześniej wykazałeś.

Jednak możesz chcieć investigate the difference między alias i alias_method. Jest to jeden z tych trudnych obszarów ruby, które mogą być nieco sprzeczne z intuicją. W szczególności zachowanie alias w odniesieniu do potomków prawdopodobnie nie jest tym, czego można się spodziewać.

Mam nadzieję, że to pomoże!

+2

świetny link dzięki! – AJcodez

5

jestem wklejając kilka przykładów metod alias

class Test 
    def simple_method 
    puts "I am inside 'simple_method' method" 
    end 

    def parameter_instance_method(param1) 
    puts param1 
    end 

    def self.class_simple_method 
    puts "I am inside 'class_simple_method'" 
    end 

    def self.parameter_class_method(arg) 
    puts arg 
    end 


    alias_method :simple_method_new, :simple_method 

    alias_method :parameter_instance_method_new, :parameter_instance_method 

    singleton_class.send(:alias_method, :class_simple_method_new, :class_simple_method) 
    singleton_class.send(:alias_method, :parameter_class_method_new, :parameter_class_method) 
end 

Test.new.simple_method_new 
Test.new.parameter_instance_method_new("I am parameter_instance_method") 

Test.class_simple_method_new 
Test.parameter_class_method_new(" I am parameter_class_method") 

WYJŚCIE

I am inside 'simple_method' method 
I am parameter_instance_method 
I am inside 'class_simple_method' 
I am parameter_class_method 
Powiązane problemy