是否有更简单的(一行)语法来别名一个类方法



我知道我可以这样做,它只是3行:

class << self
  alias :generate :new
end

但是出于好奇,有没有更简单的方法(没有分号),比如:

class_alias :generate, :new

从Ruby 1.9开始,你可以使用singleton_class方法来访问类的单例对象。这样,您还可以访问alias_method方法。该方法本身是私有的,所以您需要使用send调用它。这是你的一行:

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

请记住,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")

输出
I am inside 'simple_method' method
I am parameter_instance_method
I am inside 'class_simple_method'
I am parameter_class_method

我不相信alias有任何特定于类的版本。我通常像你之前演示的那样使用它。

然而,您可能想要研究aliasalias_method之间的区别。这是ruby的一个棘手的地方,可能有点违反直觉。特别是alias关于后代的行为可能不是您所期望的。

希望这对你有帮助!

最新更新