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。我通常使用它,就像您之前演示的那样。

但是,您可能想研究和之间的区别。这是红宝石的那些棘手领域之一,可能有点违反直觉。特别是关于后代的行为可能不是您所期望的。aliasalias_methodalias

希望这可以帮助!

于 2013-08-20T07:41:07.710 回答