2013-02-28 67 views
46

我知道我能做到以下幾點,它只是3線:是否有更簡單的(單行)語法來替代一個類方法?

class << self 
    alias :generate :new 
end 

但出於好奇,有沒有一種簡單的方法(沒有分號),如:

class_alias :generate, :new 
+5

有趣的事實:'高清self.generate;新; end'和'class_alias:generate,:new'是相同數量的字符。 – 2013-02-28 08:52:17

+0

@AmitKumarGupta這是作弊,因爲'def self.generate;新; end'在堆棧上添加了一個冗餘調用(不是真的很重要,而是儘可能精確。) – mudasobwa 2013-02-28 08:55:29

+2

@AmitKumarGupta如果您需要'new'來接受任何參數,它也不起作用。 – Ajedi32 2013-08-17 22:42:05

回答

60

從Ruby 1.9開始,您可以使用singleton_class方法來訪問類的單例對象。這樣您也可以訪問alias_method方法。該方法本身是私人的,所以你需要用send來調用它。這是你的一個班輪:

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

但是要記住,這alias不會在這裏工作。

+0

小修正 - 不需要以「self」作爲前綴。# – jaustin 2015-07-15 16:39:21

+0

@jaustin謝謝!沒有意識到,畢竟它定義在'對象' – 2015-07-15 16:54:11

+0

偉大的解決方案! – Alexander 2016-11-11 19:26:11

3

我不相信有任何類別的版本alias。我通常使用它,正如你以前所示。

但是,您可能需要在aliasalias_method之間investigate the difference。這是可能有點反直覺的ruby棘手領域之一。特別是alias關於後代的行爲可能不是你所期望的。

希望這會有所幫助!

+2

偉大的鏈接謝謝! – AJcodez 2013-08-24 14:52:36

5

我粘貼一些別名方法的例子

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") 

輸出

I am inside 'simple_method' method 
I am parameter_instance_method 
I am inside 'class_simple_method' 
I am parameter_class_method 
相關問題