我应该使用别名或alias_method?
我在alias
和alias_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_method
将self
视为在运行时确定的值。
来源: 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,但是当你这样做了几百次这样的年份,你只要倾向于尽可能地使用别名