今天看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
这里也有个总结,还不错:
- 1. alias是Ruby的一个关键字,而alias_method是Module类的一个方法
- 2. alias的参数就是方法本身(method identify),注意,不是字符串,也不是Symbol,alias_method的参数则是字符串或者symbol,并且使用逗号分隔。
- 3. alias_method可以重定义,而alias则不能 不过貌似在1.9中,alias支持symbol参数了。
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
本文结束。
本文结束。
本文结束。
本文结束。
本文结束。
本文结束。