| 本帖最后由 余烬之中 于 2014-1-27 11:36 编辑 
 taroxd 发表于 2014-1-27 10:51 ![]() 就是一个方便alias的货
 
 alias b a
 如果已有定义
 
 def okok(h,i)  # do something  yield(h,i) if block_given?  # do somethingend
def okok(h,i) 
  # do something 
  yield(h,i) if block_given? 
  # do something 
end 
 然后你再alias
 
 alias :old_okok :okokdef okok(h,i)  old_okok  haha_I_wanna_do_more # without argsend
alias :old_okok :okok 
def okok(h,i) 
  old_okok 
  haha_I_wanna_do_more # without args 
end 
 实现的话 可以是
 
 class I_AM_A_CLASS  # 已有的方法 带有区块  def okok(h, i = 1)    yield h, i  end   # do_after的实现  def do_after(m, &add_on_block) # 方法名 新增的区块    eval("alias #{"_______#{m}"} #{m}") # 别名     self.class.send :define_method, m do |*aaa, &block|                                       # *aaa是原方法的参数 &block是原方法的区块      method("_______#{m}").call(*aaa, &block) # 呼叫原方法      add_on_block.call # 呼叫新增的区块    end  endend cl = I_AM_A_CLASS.new # 创建实例# 这里是在类中实现的 建议写在模块中 然后在类中include模块 cl.do_after(:okok){p true}# 重定义方法 a # 区块是新增的语句 cl.okok(3){|u,v| p u+v} # 呼叫a 区块是原a的区块#=> 4,true
class I_AM_A_CLASS 
  # 已有的方法 带有区块 
  def okok(h, i = 1) 
    yield h, i 
  end 
  
  # do_after的实现 
  def do_after(m, &add_on_block) # 方法名 新增的区块 
    eval("alias #{"_______#{m}"} #{m}") # 别名 
  
    self.class.send :define_method, m do |*aaa, &block| 
                                       # *aaa是原方法的参数 &block是原方法的区块 
      method("_______#{m}").call(*aaa, &block) # 呼叫原方法 
      add_on_block.call # 呼叫新增的区块 
    end 
  end 
end 
  
cl = I_AM_A_CLASS.new # 创建实例 
# 这里是在类中实现的 建议写在模块中 然后在类中include模块 
  
cl.do_after(:okok){p true} 
# 重定义方法 a # 区块是新增的语句 
  
cl.okok(3){|u,v| p u+v} # 呼叫a 区块是原a的区块 
#=> 4,true 
 
 |