锁定老帖子 主题:Ruby如何打开一个函数?
精华帖 (0) :: 良好帖 (0) :: 新手帖 (4) :: 隐藏帖 (0)
|
|
---|---|
作者 | 正文 |
发表时间:2008-11-13
最后修改:2009-03-30
Ruby打开一个对象的meta class并向其中重写方法,比如: 这是定义TT2这个类 class TT2 class << self def pa out end def out(a) p a end private :out end end 下面向TT2这个类对象添加一个新的out方法 class << TT2 alias_method :_out,:out def out(a) p "new out" _out(a) end end 问题来了: 以上操作都是在类层面方法外面做的hack,如果我想把这句代码p "new out" 直接放到原来的out方法体内,比如我打算放到out方法的最后一行该怎么办? 需求是这样的: 有一个第三方的库,里面有个私有方法并不符合我的需求,我想hack一下得到这个方法体中的一个对象,这个对象只存在与这个函数空间内,所以我只能hack这个方法。 但是:1、我不想更改这个库的源代码,为了保持通用性。2、它这个方法太长了,我不想整段copy从而再写个一样的方法然后类似这样alias_method :_out,:out的,把原来方法覆盖掉。 ruby中大多数东西都是对象都是类,只是ruby不像javascript,js中函数也是一个对象,ruby中函数不是对象,如果ruby中函数也是对象的话,我想我是否也可以用class << Function;#code;end这样的操作打开我想操作的函数了? 声明:ITeye文章版权属于作者,受法律保护。没有作者书面许可不得转载。
推荐链接
|
|
返回顶楼 | |
发表时间:2008-11-13
好像有个alias_method_chain 插件,可以以aop的方式来处理函数,这个版有人发过类似的文章吧,具体不记得了,找找看吧
|
|
返回顶楼 | |
发表时间:2008-11-13
最后修改:2008-11-13
jack,不是你说的那样。
我需要的不是aliase_method :new,:old 我是要把一行代码注射到old方法中去,默认注入到最后一行就可以。 |
|
返回顶楼 | |
发表时间:2008-11-13
这样好像没有什么办法. 函数可以添加,删除,可以重新定义,但是修改内容,不行的.
|
|
返回顶楼 | |
发表时间:2008-11-13
最后修改:2008-11-13
CharlesCui 写道 jack,不是你说的那样。
我需要的不是aliase_method :new,:old 我是要把一行代码注射到old方法中去,默认注入到最后一行就可以。 class A def old puts rand end end ############ class A alias _old old def old _old puts 'new line' end end ########### A.new.old 把一行代码注射到old方法中去,默认注入到最后一行就可以。不就这样的效果么? |
|
返回顶楼 | |
发表时间:2008-11-13
最后修改:2008-11-13
axgle 写道 CharlesCui 写道 jack,不是你说的那样。
我需要的不是aliase_method :new,:old 我是要把一行代码注射到old方法中去,默认注入到最后一行就可以。 class A def old puts rand end end ############ class A alias _old old def old _old puts 'new line' end end ########### A.new.old 把一行代码注射到old方法中去,默认注入到最后一行就可以。不就这样的效果么? 如果我的old方法和你的不一样呢? 比如: class A def old @name="Lucy" puts rand end end ############ class A alias _old old def old _old puts 'new line' #你不打开_old的话,你在这个位置无论写什么都无法得到@name end end ########### A.new.old 我想给_old方法做如下的操作: class << _old attr :name end 可惜_old是个方法而不是对象。 求能打开方法的办法。 |
|
返回顶楼 | |
发表时间:2008-11-13
就是典型alias_method_chain的使用场景啊
require 'rubygems' require 'activesupport' class T def test puts 'my code here' end end puts '--- original output ---' T.new.test class T def test_with_verbose test_without_verbose puts 'additional code here' end alias_method_chain :test, :verbose end puts '--- post version output ---' T.new.test 输出: 引用 --- original output ---
my code here --- post version output --- my code here additional code here |
|
返回顶楼 | |
发表时间:2008-11-13
这个是注入阿,这个是重新包装了下. 你根本没有改动old函数的任何逻辑阿....
|
|
返回顶楼 | |
发表时间:2008-11-13
倒也是. 不过@name在哪里都能取到啊. 如果想取局部变量,直接改源码或者整个重写方法比较好,因为局部变量体现的是内部实现.
将来原始版本升级后,新的"补丁"方法一样要完蛋. |
|
返回顶楼 | |
发表时间:2008-11-13
CharlesCui 写道 Ruby可以打开一个对象,但能够打开一个函数么?
ruby中大多数东西都是对象都是类,只是ruby不像javascript,js中函数也是一个对象,ruby中函数不是对象,如果ruby中函数也是对象的话,我想我是否也可以用class << Function;#code;end这样的操作打开我想操作的函数了? 你举一个javascript的例子,来演示一下你的需求? |
|
返回顶楼 | |