使用元编程来包围类中的方法

2024-01-28

我有一些类,其中的方法会在进入和退出方法时进行记录,如下所示:
def methodName1(args) @logger.debug(">>#{callee}") ... @logger.debug("<<#{callee}") end

def 方法名2(args) @logger.debug(">>#{callee}”) ... @logger.debug("callee}”) 结尾


我倾向于在类前面添加一个动态创建的匿名模块,其实例方法使用super在打印方法进入消息之后和打印方法退出消息之前调用同名类的实例方法。

让我们首先创建一个具有两个实例方法的类,其中一个在调用时传递一个块。

class C
  def mouse(nbr_mice, impairment)
    puts "%d %s mice" % [nbr_mice, impairment]
  end
  def hubbard(*args)
    puts yield args
  end
end

C.ancestors
  #=> [C, Object, Kernel, BasicObject]
c = C.new
c.mouse(3, 'blind')
  # 3 blind mice
c.hubbard('old', 'mother', 'hubbard') { |a| a.map(&:upcase).join(' ') }
  # OLD MOTHER HUBBARD

现在我们构造一个方法来创建匿名模块并将其添加到类的前面。

def loggem(klass, *methods_to_log)
  log_mod = Module.new do
    code = methods_to_log.each_with_object('') { |m,str| str <<
      "def #{m}(*args); puts \"entering #{m}\"; super; puts \"leaving #{m}\"; end\n" }
    class_eval code
  end
  klass.prepend(log_mod)
end

现在,我们准备使用等于要添加模块的类以及要记录的该类的实例方法的参数来调用此方法。

loggem(C, :mouse, :hubbard)

C.ancestors
  #=> [#<Module:0x007fedab9ccf48>, C, Object, Kernel, BasicObject] 

c = C.new
c.method(:mouse).owner
  #=> #<Module:0x007fedab9ccf48> 
c.method(:mouse).super_method
  #=> #<Method: Object(C)#mouse> 
c.method(:hubbard).owner
  #=> #<Module:0x007fedab9ccf48> 
c.method(:hubbard).super_method
  #=> #<Method: Object(C)#hubbard> 

c.mouse(3, 'blind')
  # entering mouse
  # 3 blind mice
  # leaving mouse
c.hubbard('old', 'mother', 'hubbard') { |a| a.map(&:upcase).join(' ') }
  # entering hubbard
  # OLD MOTHER HUBBARD
  #leaving hubbard

See 模块::新 https://ruby-doc.org/core-2.2.0/Module.html#method-c-new and 模块#prepend http://ruby-doc.org/core-2.4.0/Module.html#method-i-prepend.

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

使用元编程来包围类中的方法 的相关文章

  • 如何在 Rails 3 项目中包含 SSL 证书

    我开发了一个 Rails 3 项目 它使用thin作为服务器 与 Devise 和 Doorkeeper 一起进行身份验证 我想在我的项目中添加 SSL 证书 我看过一些描述如何在 Rails 3 项目中使用 SSL 证书的帖子 但没有一个
  • Ruby/Rails - 访问“查找”表而不对其进行建模?

    这是针对 Ruby on Rails 3 0 x 项目的 我有一个 查找 表 其中包含来自供应商的数据 当我从其他来源导入数据时 我想检查此表 加入 SKU 以获取额外数据 在我的应用程序中为该表创建模型对我来说似乎不合适 我的应用程序永远
  • 如果不选择 Updated_at 属性,则无法更新 Rails 4 中的模型

    我正在从 Rails 3 2 13 升级到 4 并遇到更新模型的问题 我正在尝试仅更新模型上的单个属性 其中我只有 id 我还需要验证和回调 这在 Rails 3 中运行良好 但在 Rails 4 中遇到了麻烦 在 Rails 4 中 如果
  • 在 Ruby 1.8.7 中将带有二进制数据的 YAML 响应转换为 UTF-8

    我正在从 API 中提取响应并接收 response job unit count 1 slug Answers lc tgt ja body tgt binary 5Zue562U lc src en body src Answers j
  • 如何在 Rails 应用程序中删除 URL 的尾部斜杠? (在 SEO 视图中)

    为了避免内容重复 我希望避免通过多个 URL 带或不带尾部斜杠 访问我的网站页面 目前 URL catalog product 1 and catalog product 1 导致同一页面 我的目标是将第二个 URL 重定向到第一个 当然是
  • ruby 中 for 循环的语法

    如何在 Ruby 中执行这种类型的 for 循环 for int i 0 i
  • 在 Ruby 文档中哪里可以找到字符串转义序列?

    我可以在 中找到有关 Ruby 转义序列的详细信息 红宝石弦 http www tutorialspoint com ruby ruby strings htm and 转义序列 http en wikibooks org wiki Rub
  • 使用 FactoryGirl 测试简单的 STI

    我有一个类 它是其他一些专门处理该行为的类的基础 class Task lt ActiveRecord Base attr accessible type name command validates presence of type na
  • 耙子的目的是什么?

    我知道 Rake 代表 Ruby Make 而且我知道 Make 是一个 Unix 构建实用程序 现在 我来自 Xcode 工作 将 iPhone 应用程序构建到 Ruby 所以我以前从未使用过 Make 我唯一使用 rake 的时候是在
  • Ruby 字符串上的扫描和匹配有什么区别

    我是 Ruby 新手 并且一直使用String scan搜索某个数字第一次出现的位置 返回值在嵌套数组中有点奇怪 但我只是去了 0 0 为了我想要的价值观 我确信它有它的用途 只是我还没有使用它 我刚刚发现有一个String match方法
  • 拆分字符串而不删除分隔符

    我需要解析一个文件以获取单个 SQL 语句并从 Rails 控制器运行它们 我有以下代码 sql file RAILS ROOT lib evidence interface import sql sql stmts array File
  • 正则表达式匹配组,但组成员除外

    因此 有许多正则表达式可以匹配特定的组 如下所示 Any character except a newline m Any character the m modifier enables multiline mode w A word c
  • Ruby on Rails:如何使用 JSONPath 访问(并保存到数据库)JSON 数组中的嵌套对象/属性?

    我正在尝试将 JSON 对象数组中的数据播种到我的数据库中 我有两个单独的数据库表 属性和单位 一个属性有许多单位 我已经能够通过 API 请求 JSON 数据 然后将其播种到数据库 成功地对属性信息 属性模型 执行此操作 但是 Valua
  • 关于空 own_to 关联的最佳实践

    想象一下以下情况 我有一个dog模型和一个house模型 一只狗可以属于一个房子 一个房子可以有很多只狗 所以 Class Dog lt ActiveRecord Base belongs to house end Class House
  • Ruby:邮件 gem 在邮件中的 60 个字符后添加 \r\n

    我要移植Actionmailer x509 https github com petRUShka actionmailer x509到 Rails 3 为了做到这一点 我尝试从带有签名电子邮件的大字符串创建 Mail 对象 您可以在这一行看
  • 没有路线匹配... Rails Engine

    所以我不断收到错误 No route matches action gt create controller gt xaaron api keys 测试中抛出的是 it should not create an api key for th
  • 为什么 Ruby 中两个用空格分隔的字符串连接在一起?

    为什么这在 Ruby 中有效 foo bar gt foobar 我不确定为什么要连接字符串而不是给出语法错误 我很好奇这是否是预期的行为 以及解析器是否负责争论 没有运算符的两个字符串被视为单个字符串 或者语言定义本身指定了这种行为 隐式
  • Rails 3.1 引擎迁移不起作用

    我正在创建一个带有迁移的 Rails 3 1 引擎 rake db migration 在该引擎和主机应用程序内运行良好 但我需要将此引擎包含到另一个 Rails 引擎中 第二个引擎包含用于测试的虚拟应用程序 我将这一行添加到该虚拟应用程序
  • 如何从 Rails 中的枚举值获取键名?

    我的模型中有一个与数据库中的列相对应的枚举 枚举看起来像 enum efficency High 0 Medium 1 Low 2 如何从值中获取密钥 例如 我的值为 0 我需要获取值 High 任何帮助 将不胜感激 Model effic
  • Rspec 通过 mTurk 测试实时结果

    我正在通过 Rspec 测试代码在 mTurk 上创建点击 但同时我需要测试必须从 mTurk 发回的结果 为了节省每次测试的复杂性 我使用 VCR 将 HTTP 请求记录在盒式磁带中 我该如何实施这个测试 好吧 我为此做了一些修改 我使用

随机推荐

  • 在 Python 3 中未显式打开文件时处理从字节到字符串的转换

    我使用 Requests 模块进行授权 然后从 Web API 中提取 csv 内容 并使其在 Python 2 7 中正常运行 我现在想在 Python 3 5 中编写相同的脚本 但遇到一些问题 iterator should retur
  • 使用注释来注入依赖项是否会消除依赖项注入(外部配置)的主要好处?

    我正在使用 Spring 这是一个控制器 Controller public class PersonController Resource name PersonService private PersonService personSe
  • 如何以编程方式获得 Scenekit 关卡编辑器的优势

    我刚刚运行了一些测试 比较了加载 创建场景的不同方式的性能 以了解性能影响 该测试只是渲染一个 32x32 的立方体网格 并观察 CPU 使用率 内存 能源和渲染时间 不是很科学 但有一些明确的结果 这四项测试包括 Load a dae e
  • ItemTouchHelper:防止越界拖动

    我有一个带有 ItemTouchHelper 的回收器视图 它允许拖动项目 我想将拖动限制在回收器视图的边界内 即 您不能只将视图拖动到容器之外 从而使其消失 我尝试像这样检查绝对坐标 Override public void onChil
  • Java:计算时区差异

    如何在 Java 中获取特定日期和时区与 GMT 的时差 确定特定时区是否处于夏令时非常简单 boolean isIsraelInDST TimeZone getTimeZone Israel inDaylightTime new Date
  • 如何在extjs中的网格视图列中添加按钮?

    创建新行时 一个字段应包含一个在扩展 JS 中动态创建的按钮 Each button should contain different name and action listener The column should like give
  • Excel VBA 将项目添加到组合框而不重复项目

    我想将以下项目添加到组合框中 但如果有重复的项目 则只应添加一个 A 1 john 2 john 3 marry 4 marry 5 john 6 lisa 7 frank 8 marry 我希望组合框结果是john marry lisa
  • 使用特定方法控制XML序列化格式

    我有一个 DateTime 和一个子类 我想要专门针对 XML 序列化对其进行格式化 通常 在不指定任何内容的情况下 DateTime 的序列化只会遵循当前的区域性 但我希望 DateTime 以某种方式格式化 即使不可反序列化 子类也是如
  • Pip 无法再从 https 克隆 - 错误 128

    我有一个使用标准 https 克隆语法的项目已经有一段时间了 就在今天下午 它工作得很好 现在 我得到error code 128每次我尝试克隆时 Obtaining myproject from git git myurl myuser
  • Huggingface 保存标记器

    我正在尝试将标记生成器保存在 Huggingface 中 以便稍后可以从不需要访问互联网的容器中加载它 BASE MODEL distilbert base multilingual cased tokenizer AutoTokenize
  • 为什么使用 if 可以比较字符串与 &str,但使用 match 则不行?

    我正在尝试实现一个读取命令行参数并将它们与硬编码字符串文字进行比较的函数 当我与if声明它就像一个魅力 fn main let s String from holla if s holla println it worked 但使用一个ma
  • 是否可以预测数字生成器中的下一个数字? [关闭]

    Closed 这个问题需要多问focused help closed questions 目前不接受答案 对于编程来说 它永远不是 随机的 甚至随机生成器也使用算法来预测随机数 但是 如果知道生成方法 是否有可能预测接下来将生成的 5 个数
  • 从属性数组创建动态嵌套对象

    这听起来像是一个简单的任务 但我不太明白 我有一个数组 var array opt1 sub1 subsub1 subsubsub1 我想从中生成以下对象 opt1 sub1 subsub1 subsubsub1 我有办法做到这一点 制作一
  • GAS - 使用 UrlFetchApp 进行身份验证 - 表单到电子表格

    我正在测试 UrlFetchApp 的功能并从表单及其电子表格传递数据 我知道可以用另一种方式做到这一点 但是我正在 google 脚本本身中测试 UrlFetchApp 的功能 第一次使用它 并希望让它与此方法一起使用 这是我得到的场景
  • 如何在 React Native 中检查 ios 和 android 的推送通知权限?

    我想检查 ios 和 android 的推送通知权限 我想查看用户是否已从其设备设置中关闭推送通知权限 如果需要用本机编码 是否有任何插件或任何代码我可以参考 你可以检查反应本机权限 https github com yonahforst
  • JAX-WS 中的 HTTP 连接重用

    使用 JAX WS 时如何启用 HTTP 连接重用 当我们使用 AXIS2 时 我们设置org apache axis2 transport http HTTPConstants REUSE HTTP CLIENT客户端存根选项中的属性 J
  • XNA 鼠标移动

    我之前在 XNA 中制作过一些游戏 现在我即将开始一个新项目 我想做的一件事是让鼠标移动 只是为了澄清 因为我已经看到一些类似的问题导致混乱 我想获得鼠标的移动 不是光标的位置或从一帧到下一帧的位置变化 我只想要有关鼠标如何移动的数据 在我
  • onPageScrolled() 没有被调用

    我正在尝试熟悉 ViewPager 我的代码如下 问题是 onPageChangeListener 方法没有被调用 可能是什么问题 public class TabsViewPagerFragmentActivity extends She
  • Android Studio Gradle 构建失败。错误:原因:对等方未经过身份验证

    我已经创建了一个项目并且 gradle 同步工作成功 当我尝试创建另一个项目时 它失败并给出错误消息 Gradle
  • 使用元编程来包围类中的方法

    我有一些类 其中的方法会在进入和退出方法时进行记录 如下所示 def methodName1 args logger debug gt gt callee logger debug lt lt callee end def 方法名2 arg