58

私は次のことができることを知っています、そしてそれはたった3行です:

class << self
  alias :generate :new
end

しかし、好奇心から、次のような(セミコロンなしの)より簡単な方法はありますか?

class_alias :generate, :new
4

3 に答える 3

75

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

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

ただし、aliasここでは機能しないことに注意してください。

于 2013-10-10T13:35:26.727 に答える
7

エイリアスメソッドの例をいくつか貼り付けています

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
于 2015-12-12T06:26:18.503 に答える
3

のクラス固有のバージョンはないと思いますalias。私は通常、あなたが以前に示したようにそれを使用します。

ただし、との違いを調査することをお勧めします。これは、少し直感に反する可能性があるルビーのトリッキーな領域の1つです。特に、子孫に関するの振る舞いは、おそらくあなたが期待するものではありません。aliasalias_methodalias

お役に立てれば!

于 2013-08-20T07:41:07.710 に答える