2013-02-28 4 views
46

私は次の操作を行うことができます知っている、それはわずか3行だ:私はしません1つのクラスメソッドの別名を付けるより簡単な(1行の)構文がありますか?

class_alias :generate, :new 
+5

楽しい事実: 'DEF self.generate。新しい; end 'と 'class_alias:generate、:new'は同じ文字数です。 –

+0

@AmitKumarGuptaそれは不正なことです、 'def self.generate;新しい; (実際には重要ではなく、できるだけ正確であるように)スタック上に冗長な呼び出しを追加します。 – mudasobwa

+2

@AmitKumarGupta引数を取るには 'new'が必要な場合には動作しません。 – Ajedi32

答えて

60

Ruby 1.9以降では、singleton_classメソッドを使用してクラスのシングルトンオブジェクトにアクセスできます。この方法でalias_methodメソッドにアクセスすることもできます。メソッド自体はプライベートなので、sendで呼び出す必要があります。ここにあなたの1つのライナーは次のとおりです。

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

aliasはここで働いていないということ、しかし心に留めておいてください。

+0

小規模な訂正 - 「自己」の接頭語は必要ありません。 – jaustin

+0

@jaustinありがとう!結局のところ、 'Object'で定義されていることを理解していませんでした –

+0

素晴らしい解決策! – Alexander

3

class << self 
    alias :generate :new 
end 

しかし、好奇心から、のような(セミコロンなし)簡単な方法がありますaliasのクラス固有のバージョンがあると考えてください。以前に実証したように私は通常それを使用します。

investigate the differencealiasalias_methodの間にすることができます。これは、直感的ではないルビのトリッキーな領域の1つです。特に、子孫に関するaliasの動作は、おそらくあなたが期待するものではありません。

希望すると便利です。

+2

素晴らしいリンクありがとう! – AJcodez

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

OUTPUTを貼り付けています

I am inside 'simple_method' method 
I am parameter_instance_method 
I am inside 'class_simple_method' 
I am parameter_class_method 
関連する問題