| 本帖最后由 余烬之中 于 2014-2-2 09:23 编辑 
 
 好吧 新手杀手alias 我还是举例子吧 先是super
 一个父类
 class Base   def meet      say "Hello!"   end   def say *args      print *args   endend
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?"   endend
class Derive < Base 
   def meet 
      super 
      say "How are you going?" 
   end 
end 
父类的实例和子类的实例
 b = Base.newd = 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"   endend Base.new.meet #=> "AAAAAAA"
===============================================使用alias的情况class Base 
   def say *args 
      print "AAAAAAA" 
   end 
end 
  
Base.new.meet #=> "AAAAAAA" 
 class Base   alias old_say say   def say      old_say      print "AAAAAAA"   endend 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  endend #小A的脚本class  Player  alias old_talk talk  def talk *args    old_talk     puts "小A"  endend #小B的脚本class Player  alias old_talk talk  def talk *args     old_talk     puts "小B"  endend #运行p = Player.newp.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"  endend #小B的脚本class Player  alias old_talk_of_B talk  def talk *args     old_talk_of_B      puts "小B"  endend #运行p = Player.newp.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时只能用后者】
 |