本帖最后由 余烬之中 于 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 something end
def okok(h,i)
# do something
yield(h,i) if block_given?
# do something
end
然后你再alias
alias :old_okok :okok def okok(h,i) old_okok haha_I_wanna_do_more # without args end
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 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
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
|