我应该使用别名或alias_method?

我在aliasalias_method上find了一篇博文。 如该博客文章中给出的示例所示,我只是想将方法别名到同一个类中的另一个方法。 我应该用哪个? 我总是看到alias ,但有人告诉我alias_method更好。

使用别名

 class User def full_name puts "Johnnie Walker" end alias name full_name end User.new.name #=>Johnnie Walker 

alias_method的用法

 class User def full_name puts "Johnnie Walker" end alias_method :name, :full_name end User.new.name #=>Johnnie Walker 

博客文章链接在这里

如果需要,可以重新定义alias_method 。 (它在Module类中定义)。

alias的行为根据其范围而变化,并且有时是相当不可预测的。

判决:使用alias_method – 它给你一个更多的灵活性。

用法:

 def foo "foo" end alias_method :baz, :foo 

除了语法之外, 主要区别在于范围

 # scoping with alias_method class User def full_name puts "Johnnie Walker" end def self.add_rename alias_method :name, :full_name end end class Developer < User def full_name puts "Geeky geek" end add_rename end Developer.new.name #=> 'Gekky geek' 

在上面的例子中,方法“name”select“Developer”类中定义的方法“full_name”。 现在让我们试试alias

 class User def full_name puts "Johnnie Walker" end def self.add_rename alias :name :full_name end end class Developer < User def full_name puts "Geeky geek" end add_rename end Developer.new.name #=> 'Johnnie Walker' 

使用别名时,“name”方法不能selectDeveloper中定义的“full_name”方法。

这是因为alias是一个关键字,它在词汇范围。 这意味着在阅读源代码时将self看作是self的价值。 相比之下, alias_methodself视为在运行时确定的值。

来源: http : //blog.bigbinary.com/2012/01/08/alias-vs-alias-method.html

赞成alias而不是alias_method一点是它的语义被rdoc识别,导致在生成的文档中整齐的交叉引用,而rdoc完全忽略了alias_method

我认为有一个不成文的规则(就像一个惯例),说使用“别名”只是为了注册一个方法名称别名,意味着如果你想给你的代码的用户一个多个名字的方法的用户:

 class Engine def start #code goes here end alias run start end 

如果您需要扩展您的代码,请使用ruby meta替代方法。

 class Engine def start puts "start me" end end Engine.new.start() # => start me Engine.class_eval do unless method_defined?(:run) alias_method :run, :start define_method(:start) do puts "'before' extension" run() puts "'after' extension" end end end Engine.new.start # => 'before' extension # => start me # => 'after' extension Engine.new.run # => start me 

一年后,问这个问题来了一个新的文章:

http://erniemiller.org/2014/10/23/in-defense-of-alias/

看来“这么多男人,这么多头脑”。 从前一篇文章作者鼓励使用alias_method ,而后者则build议使用alias

不过,在上面的博文和答案中,对这些方法有一个共同的概述:

  • 如果要将alias限制到定义的范围,请使用alias
  • 使用alias_method允许inheritance的类访问它

尽pipe它可能很小,但是我喜欢别名的两个方面,比alias_method更重要:

(1)别名较短

(2)你不必input,

我知道这很less,但是当你这样做了几百次这样的年份,你只要倾向于尽可能地使用别名