本帖最后由 余烬之中 于 2014-2-2 09:23 编辑
好吧 新手杀手alias 我还是举例子吧 先是super
一个父类class Base def meet say "Hello!" end def say *args print *args end end
class Base
def meet
say "Hello!"
end
def say *args
print *args
end
end
一个子类class Derive < Base def meet super say "How are you going?" end end
class Derive < Base
def meet
super
say "How are you going?"
end
end
父类的实例和子类的实例b = Base.new d = Derive.new b.meet #=> Hello! d.meet #=> Hello!How are you going?
b = Base.new
d = Derive.new
b.meet #=> Hello!
d.meet #=> Hello!How are you going?
大概你已经能理解super了 现在是alias 既然上面有了一个Base类 我们就用它举例
分别考虑两种情况
===============================================不使用alias的情况
class Base def say *args print "AAAAAAA" end end Base.new.meet #=> "AAAAAAA"
class Base
def say *args
print "AAAAAAA"
end
end
Base.new.meet #=> "AAAAAAA"
===============================================使用alias的情况
class Base alias old_say say def say old_say print "AAAAAAA" end end Base.new.meet #=> "Hello!AAAAAAA"
class Base
alias old_say say
def say
old_say
print "AAAAAAA"
end
end
Base.new.meet #=> "Hello!AAAAAAA"
===============================================
总结如下
1.已知方法a 如果之后再定义def a .... end 那么新的内容会覆盖旧的内容
2.alias可以保存某方法(不仅是方法)在某时刻的状态(理解用),相当于拍个照片,或者类比成保存一个副本
3.alias的语法为 【alias 副本名 原名】
4.之后可以在任何地方调用此副本 副本不随源的变化而变化
5.这种手段一般用于给方法新增内容 新的say其实已经覆盖了旧的say 但是old_say还在 可以被调用
6.新增内容时,优先采用alias追加定义
7.注意!如果出现了alias重名,常常出现“Stack Level Too Deep”错误,例子:# 小A与小B都在写脚本 对已有的脚本进行修改 #已有脚本 class Player < Role def talk *args say *args end def say *args puts *args end end #小A的脚本 class Player alias old_talk talk def talk *args old_talk puts "小A" end end #小B的脚本 class Player alias old_talk talk def talk *args old_talk puts "小B" end end #运行 p = Player.new p.talk "Hello!" # Stack Level Too Deep
# 小A与小B都在写脚本 对已有的脚本进行修改
#已有脚本
class Player < Role
def talk *args
say *args
end
def say *args
puts *args
end
end
#小A的脚本
class Player
alias old_talk talk
def talk *args
old_talk
puts "小A"
end
end
#小B的脚本
class Player
alias old_talk talk
def talk *args
old_talk
puts "小B"
end
end
#运行
p = Player.new
p.talk "Hello!"
# Stack Level Too Deep
但这样就没有错误#小A的脚本 class Player alias old_talk_of_A talk def talk *args old_talk_of_A puts "小A" end end #小B的脚本 class Player alias old_talk_of_B talk def talk *args old_talk_of_B puts "小B" end end #运行 p = Player.new p.talk "Hello!" #=> "Hello!小A小B"
#小A的脚本
class Player
alias old_talk_of_A talk
def talk *args
old_talk_of_A
puts "小A"
end
end
#小B的脚本
class Player
alias old_talk_of_B talk
def talk *args
old_talk_of_B
puts "小B"
end
end
#运行
p = Player.new
p.talk "Hello!"
#=> "Hello!小A小B"
常见的alias(别名)方式有几种要特别注意 常常与别人重复
·old_原名(say=>old_say)
·old_原名开头几个字母(initialize=>old_init)
推荐的别名方式
·当前脚本名略缩_方法(或方法略缩)
·当前脚本名略缩_方法(或方法略缩)_当前年月日
·自己英文名略缩_当前脚本名略缩_方法(或方法略缩)
·自己英文名略缩_当前脚本名略缩_方法(或方法略缩)_当前年月日
比如我常常这样
update=>mo_vtpb_upt
【另外提一点 alias一般有两种写法:
1.alias old_a a
2.alias :old_a :a
在这里这没什么区别 喜好问题 以后遇到alias_method时只能用后者】 |