ruby – 如何覆盖Kernel.load
我需要覆盖
Kernel.load 才能观察和处理我们为监控而编写的一些Ruby文件.然而,它似乎对这种恶作剧免疫.
很容易覆盖 这就是为什么它似乎受到保护而不受覆盖: Kernel.module_eval do alias_method :original_require,:require def require(filename) require_result = original_require(filename) puts "required #{filename}" require_result end alias_method :original_load,:load def load(filename,wrap=true) load_result = original_load(filename,wrap) puts "loaded #{filename}" load_result end end include Kernel require 'open-uri' puts 'done' 运行输出: required uri/rfc2396_parser required uri/rfc3986_parser required uri/common required uri/common required uri/generic required uri/generic required uri/ftp required uri/generic required uri/http required uri/http required uri/https required uri/generic required uri/ldap required uri/ldap required uri/ldaps required uri/generic required uri/mailto required uri required stringio required date_core required date required time required open-uri done 我满足于只覆盖require和require_relative.但是,我很好奇负载是怎么回事. 后记: 看起来load不是由require或require_relative调用的. Mea culpa.好抓Matt. 这个问题类似于“How to override require in Ruby?”. 好读: >“Ways to load code” J?rg’s评论
非常明智,值得使用. > http://ruby-doc.org/core-2.2.2/Module.html#method-i-prepend 解决方法
根据“
When monkey patching a method,can you call the overridden method from the new implementation?”中的示例,以下两个简单的示例似乎可以覆盖require和require_relative.
module Kernel old_require = method(:require) define_method(:require) do |filename| puts "require #{filename}" old_require.call(filename) end old_require_relative = method(:require_relative) define_method(:require_relative) do |filename| puts "require_relative #{filename}" old_require_relative.call(filename) end end 要么 module KernelExtensions def require(filename) puts "require #{filename}" super end def require_relative(filename) puts "require_relative #{filename}" super end end class Object prepend KernelExtensions end 使用第二个运行 module Kernel prepend KernelExtensions end 没有工作,但由于Object包含内核,使用类Object overriding似乎干净利落. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |
- 金额输入框 在 hybrid 下 ios/android h5 处理情况
- fastjson使用-- @JSONField使用(转)
- non-aggregates(非聚合)对象不能使用初始化列表
- 详解C语言结构体中的函数指针
- AJAX - $.post(url,data,function,type)-2(参数为key:value
- Oracle备份恢复之expdp/impdp_超越OCP精通Oracle视频课程培
- objective-c – NSURL baseURL返回nil.任何其他方法来获取实
- 内存依赖推测会阻止BN_consttime_swap为常数吗?
- Ajax异步处理
- [sqlite3]_[初级]_[使用正则表达式REGEXP查询]