今天看rails的源码里有alias_method的方法,但我好像只知道alias。
ctrl+b进入alias_method的源码,居然是stub方法。
def alias_method(new_name, old_name) #This is a stub, used for indexing end
看一下文档,总结:
相同点:
都是给方法起别名
区别 :
alias是ruby的关键字(看看下面代码的颜色哈~)
alias_method是stub方法,可以被覆盖
alias_method :breakpoint_server=, :breakpoint_server alias breakpoint_server breakpoint_server
这里也有个总结,还不错:
alias 和 self 深入理解
#1 给实例方法起别名
class AliasMethodPractice def ist_m_a puts "in #{__method__}" end def self.cls_m_x puts "in #{__method__}" end alias ist_m_b ist_m_a #<=============here end obj = AliasMethodPractice.new obj.ist_m_a obj.ist_m_b
输出也有点意思:你看出来了么?
in ist_m_a
in ist_m_a
#2 给类方法起别名
class AliasMethodPractice def ist_m_a puts "in #{__method__}" end def self.cls_m_x puts "in #{__method__}" end alias ist_m_b ist_m_a puts "self=#{self}" puts "self.class=#{self.class}" alias cls_m_y cls_m_x # undefined method `cls_m_x' for class `AliasMethodPractice' (NameError) alias AliasMethodPractice.cls_m_y AliasMethodPractice.cls_m_x # syntax error, unexpected '.' (SyntaxError) alias cls_m_y AliasMethodPractice.cls_m_x # syntax error, unexpected '.', expecting kEND (SyntaxError) #<=============here 是错误的 end obj = AliasMethodPractice.new obj.ist_m_a obj.ist_m_b AliasMethodPractice.cls_m_x
这种写法是会报错的!原因,成了方法调用。
看看下面的self输出的区别吧:
class AliasMethodPractice def ist_m_a puts "in #{__method__}" end def self.cls_m_x puts "in #{__method__}" end alias ist_m_b ist_m_a puts "self=#{self}" puts "self.class=#{self.class}" class << self puts "self=#{self}" puts "self.class=#{self.class}" end #<=============here end obj = AliasMethodPractice.new obj.ist_m_a obj.ist_m_b AliasMethodPractice.cls_m_x #AliasMethodPractice.cls_m_y
输出:
self=AliasMethodPractice
self.class=Class
self=#<Class:AliasMethodPractice>
self.class=Class
in ist_m_a
in ist_m_a
in cls_m_x
看见了区别,就比较好说了。
下面的写法才可以实现给类方法取别名:
class AliasMethodPractice def ist_m_a puts "in #{__method__}" end def self.cls_m_x puts "in #{__method__}" end alias ist_m_b ist_m_a puts "self=#{self}" puts "self.class=#{self.class}" class << self puts "self=#{self}" puts "self.class=#{self.class}" alias cls_m_y cls_m_x #It is that! #<=============here end end obj = AliasMethodPractice.new obj.ist_m_a obj.ist_m_b AliasMethodPractice.cls_m_x AliasMethodPractice.cls_m_y
输出:
self=AliasMethodPractice
self.class=Class
self=#<Class:AliasMethodPractice>
self.class=Class
in ist_m_a
in ist_m_a
in cls_m_x
in cls_m_x
本文结束。
本文结束。
本文结束。
本文结束。
本文结束。
本文结束。