Ruby alias_method还是一个新方法?

时间:2013-11-18 16:02:20

标签: ruby

为什么我应该像这样使用alias_method:

alias_method :author, :name

而不是简单地执行以下操作?

def author
self.name
end

3 个答案:

答案 0 :(得分:1)

因为它更干净,Ruby强制执行的任务之一就是惯例。

此外,如果您要更改name方法的参数数量,那么您必须在author方法上更改它,而使用method_alias时,您不必在多个位置更改它。 / p>

然而,如果你想使用你写的方法,你肯定可以说参数的数量不会改变(我确信它不会在你的情况下),你可以做到这一点,它是没错,但你也不需要self部分,你可以这样写:

def author
  name
end

答案 1 :(得分:1)

alias_method实际上会为您创建该方法的副本。如果您稍后重新定义了name某些新行为,author仍会保留原始行为。如果要保留原始行为,这非常有用。见the docs for alias_method

  

使new_name成为方法old_name的新副本。这可用于保留对被覆盖的方法的访问。

module Mod
  alias_method :orig_exit, :exit
  def exit(code=0)
    puts "Exiting with code #{code}"
    orig_exit(code)
  end
end
include Mod
exit(99) # => Exiting with code(99)

答案 2 :(得分:1)

编写完整方法需要花费大量时间。此外,当您想要复制更深入的方法时,可以使用alias_method

最后,还有一个微妙之处。

class Foo
  def bar1
    "This is bar 1"
  end

  alias :bar2, :bar1

  def bar1
    "This is sparta!"
  end
end

puts Foo.new.bar1 # => "This is sparta!"
puts Foo.new.bar2 # => "This is bar 1"

以上显示别名总是指向第一种方法。在考虑继承时这很重要。

See the Docs。他们说这是旧方法的副本。