将 super 与 class_eval 一起使用

2023-12-20

我有一个应用程序,其中包含用于添加客户端自定义的核心类模块。

我发现 class_eval 是重写核心类中方法的好方法,但有时我想避免重写整个方法,而只是遵循原始方法。

例如,如果我有一个名为account_balance,最好在我的模块(即包含在类中的模块)中执行类似的操作:

module CustomClient
  def self.included base
    base.class_eval do
      def account_balance
        send_alert_email if balance < min
        super # Then this would just defer the rest of the logic defined in the original class
      end
    end
  end
end

但使用 class_eval 似乎需要super方法脱离查找路径。

有谁知道如何解决这个问题?

Thanks!


我认为有几种方法可以做你想做的事。一种是打开类并为旧实现指定别名:

class MyClass
  def method1
    1
  end
end

class MyClass
  alias_method :old_method1, :method1
  def method1
    old_method1 + 1
  end
end

MyClass.new.method1
 => 2 

这是一种形式猴子修补 http://en.wikipedia.org/wiki/Monkey_patch,所以最好适度使用这个习语。此外,有时需要一个单独的辅助方法来保存通用功能。

EDIT:有关更全面的选项,请参阅 Jörg W Mittag 的答案。

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

将 super 与 class_eval 一起使用 的相关文章

  • 用 ruby​​ 中的数组内容替换字符串?

    String Test string Test array link1 link2 如何替换这样的字符串 输出应该是String link1 string link2 字符串 gsub 可以返回一个枚举器 所以这很简单 string gsu
  • 输出到控制台,同时保留 ruby​​ 中的用户输入

    我有一个 ruby 脚本 它同时异步接收和显示来自服务器的消息 并允许用户在控制台上输入 当收到消息时 当前正在将其写入用户正在键入的内容的中间 输入本身并没有乱码 但看起来很糟糕 理想情况下 它将保存用户当前的输入 输出消息 然后在下一行
  • 在 Ruby/Sinatra 中解码 Facebook 的签名请求

    由于 Facebook 不赞成使用新的 FBML 我正在寻找一种新方法来创建 显示 选项卡 向粉丝显示一个版本 向非粉丝显示另一个版本的页面选项卡 Facebook 已将数据添加到signed request 中 当用户在应用程序中选择您的
  • 地图、每个和收集之间有什么区别? [复制]

    这个问题在这里已经有答案了 在 Ruby 中 功能之间有什么区别吗 each map and collect each不同于map and collect but map and collect是相同的 技术上map是一个别名collect
  • 避免在 Ruby 中自动从 Fixnum 转换为 Bignum

    我正在将算法从 C 移植到 Ruby 该算法有一个方法返回一个int有时会溢出 private static int NextRandom int n return 1234567890 n 12345 该算法利用溢出来避免该函数返回的值超
  • Rails Partial (Rails 3, HAML) 任意慢

    我使用的是 Rails 3 0 1 HAML 0 3 22 和 Mongrel 1 1 5 MongoMapper 不是 AR 我正在渲染一个列表 每个列表项都是它自己的部分 每次页面渲染其中一个列表项部分时 渲染时间都会延长近 100 倍
  • 在 debian Squeeze 上安装 RoR

    有什么方法可以在我的 debian squeeze 上安装 Ruby 1 9 2 或 1 8 7 Rails 3 吗 您可能不想在生产计算机上使用 RVM 它的 PATH 魔力会在不明显的地方 例如 cron 作业 被破坏 然后你就会陷入困
  • 从 ActiveRecord 获取表名

    I used ActiveRecord Base set table name在动态创建的 ActiveRecord 类上设置我的表名称 现在我需要知道稍后如何获得该值 api 文档没有提及如何执行此操作 另外 我无法从 ActiveRec
  • 如何检查rails上传的文件类型?

    我如何查看即将到来的文件类型 例如 csv 或 xls 请给个代码 我得到文件是这样的 aut name uploaded io original filename File open Rails root join public uplo
  • BigDecimal 无法强制转换为 BigDecimal

    这应该很简单 但它却爆炸了 有任何想法吗 d BigDecimal new 2 0 YAML load a gt d to yaml TypeError BigDecimal can t be coerced into BigDecimal
  • 如何让 Sinatra 通过 HTTPS/SSL 工作?

    正如标题所示 谷歌没有提供任何与此相关的有用信息 如何为 Sinatra 应用程序设置和配置 HTTPS SSL 如何创建 HTTPS 路由 我以前从未在我的应用程序中使用过 HTTPS 也没有调整 Rack 其他内容的经验 所以我很欣赏详
  • 带有附加参数的redirect_to

    我是一个菜鸟 redirect to users url notice Succeed p p 然后我添加一个message它失败了 redirect to users url notice Succeed message test p p
  • Ruby 可选参数和多个参数

    我试图将方法的第一个参数设置为可选 后跟任意数量的参数 例如 def dothis value 0 args 我遇到的问题是 这似乎实际上不可能 当我打电话时dothis hey how are you good 我希望它将值设置为默认值
  • 为什么 rand() 总是返回相同的数字?

    我在用 兰特 200 在我的 Rails 应用程序中 当我在控制台中运行它时 它总是返回随机数 但如果我在应用程序行中使用它 index rand 200 索引总是相同的号码 为什么会这样以及如何克服这个问题 简单的伪随机数生成器实际上生成
  • 回滚后是否应该删除迁移

    我对 ruby 和 Rails 相当陌生 刚刚开始了解迁移 我的问题是回滚后删除迁移的最佳实践或正确时间是什么 到目前为止 我读到的内容是回滚后是否删除迁移的观点问题 但是在团队中工作时删除迁移是否有任何重大影响 以及保留迁移文件相对于删除
  • 在编译时查找数组元素位置

    已编辑 大家好 我有一个元素数组 这些元素在程序的所有执行过程中都不会改变 并且其中的项目可以在自己的数组中包含子元素 我必须在处理数组之前准备好它 但是 因为我知道数组不会改变 所以我想将其声明为const 并在编译时准备所有这些 这样我
  • Emacs、ruby:将 do 结束块转换为大括号,反之亦然

    我经常发现自己转换这样的代码 before do something end to before something 有没有办法在 emacs 中自动执行此任务 我使用 ruby mode 和 rinary 但它们在这里没有太大帮助 rub
  • Rspec to have(n).items undefined 方法

    我正在尝试遵循指南关于代码 tuts http code tutsplus com tutorials ruby for newbies testing with rspec net 21297我不断收到错误 这是我的库规范 require
  • Ruby gem 环境问题 - LoadError: no such file to load -- robots

    我正在尝试使用 anemone gem 编写一个爬虫 这需要 robots gem 不管出于什么原因 机器人绝对不会包括在内 这是我的一些环境信息 gem list d robots LOCAL GEMS robots 0 10 1 Aut
  • 用于验证目的的动态查找方法

    我正在使用 Ruby on Rails 3 0 7 我想在运行时查找一些记录以进行验证 但为该查找方法传递 设置一个值 也就是说 在我的班级中 我有以下内容 class Group lt lt ActiveRecord Base valid

随机推荐

  • 获取数据库表中的数据,如果不存在则将其插入,否则返回行 ID

    我有一个包含 date file creation 列的表文件 我想创建一个包含日期文件创建的表日期 当我插入新文件时 我检查表日期是否存在 我返回行 ID 并将其作为外部插入键在表文件中 否则我插入一个新日期并获取其新行 ID 以将其插入
  • 页面中的 Nuxtjs 异步等待在页面刷新时不起作用

    我尝试使用 vuex 和 nuxt js 在页面的 fetch 方法中获取数据 但是每当有人刷新页面时 它都会失败 但当我通过 nuxt 导航导航时 它会工作 所以在我的页面中我有 fetch store params store disp
  • 添加一列排名

    我有一些数据 test lt data frame A c aaabbb aaaabb aaaabb aaaaab bbbaaa 等等 所有元素的长度都相同 并且在我获取它们之前就已经排序了 我需要创建一个新的排名列 第一 第二 第三 之后
  • 删除 R 输出中的反引号

    我有某些变量lm在 R 中自动用反引号 反引号换行 例如名称中带有冒号的变量 经过一些处理后 我尝试用以下方法写出线性模型的变量和系数write table 不幸的是 反引号也被写出来了 如何防止这些反引号被写入 举一个简单但不切实际的例子
  • C# 调用 ActiveDirectory 的 SetPassword 函数的问题

    我成功创建了一个新用户 然后尝试使用以下代码设置其初始密码 newUser AuthenticationType AuthenticationTypes Secure newUser Invoke SetPassword new objec
  • DCG和左递归

    我正在尝试实现一个 dcg 它采用一组 a b c d 形式的字符串 我遇到的问题是 如果我有一个 s a c b 它返回 true 这是正确的答案 但是当我有 s a c f 形式的查询时 它不会返回答案 并且会耗尽本地堆栈 s gt s
  • ftp_get 不适用于大文件

    这是我的代码 con ftp connect ftpserver com ftp login con username password ftp pasv con true ftp set option con FTP TIMEOUT SE
  • create-react-app 不会生成 public 和 src 文件夹,因此无法启动

    我已经安装 CRA 一个多月了 并且一直在使用它 没有任何问题 但是今天我创建了一个新的 React 应用程序 它构建了文件夹和目录 但它不生成 src 和公共文件夹 它只是生成节点 module 文件夹 因此当我运行 npm start
  • Cordova/phonegap 活动生命周期

    我正在cordova应用程序中为android开发一个地图插件 让我们暂时忘记已经有不止一个了 并认为这是一个学术问题 的文档MapView states http developer android com reference com g
  • PhoneGap/Cordova iOS:捕获有持续时间限制的视频(即 30 秒)

    我想将视频捕捉时间限制为 30 秒 截至目前 PhoneGap 文档说明了 iOS 实现的以下内容 不支持持续时间参数 无法以编程方式限制录制长度 我确实找到了这篇文章 它似乎给出了纯粹客观的 C 实现的解决方案 iPhone 5秒视频拍摄
  • os_signpost 在模拟器上有效,但在设备上运行时无效

    我想使用仪器跟踪时间的函数之一中有以下代码行 当我从仪器在模拟器上运行该应用程序时 使用 os signpost 测量的时间确实显示出来 我可以准确地测量我需要的东西 Then I switch to device same code Ho
  • R - 分割数据框并保存到不同的文件

    我有一个数据框 其中包含多个地点的每月温度数据 gt df4 1 36 location variable cut month year freq 1 Adamantina temperature 10 Jan 1981 21 0 646
  • 如何消除 SSIS 作业中的“未使用的输出列”警告?

    我正在尝试消除 SSIS 进度日志中的一些虚假警告 我收到一堆关于使用原始 SQL 完成工作的任务中未使用列的警告 我有一个数据流 负责在加载新数据之前将数据归档到临时表中 数据流如下所示 OLEDB Source task read st
  • Xcode 是否隐式将 plist 转换为二进制格式?

    Xcode 在构建过程中是否会隐式地将项目中的 plist 转换为二进制文件 我不认为它隐式地这样做 但很难确定 有一个名为 Property List Output Encoding 又名 PLIST FILE OUTPUT FORMAT
  • 如何修复SSL证书验证失败

    我在本地使用 PHPMailer Apache 和 PHP 当我测试我的 SSL 配置和我的 cacerts 时 我得到 default cert file C Program Files Common Files SSL cert pem
  • 在VB.NET中使用Moq的VerifySet

    我有一个功能可以更新 ASP NET 会员资格提供程序中的用户
  • Python Kivy:如何在单击按钮时调用函数?

    我对使用 kivy 库还很陌生 我有一个 app py 文件和一个 app kv 文件 我的问题是我无法在按下按钮时调用函数 app py import kivy from kivy app import App from kivy uix
  • 如何在 wpf 中使用 WindowChrome 而不使用 Windows Aero 玻璃效果,黑色边框

    我正在尝试使用 WindowChrome 类自定义窗口边框 没有 Windows Aero 玻璃效果 正如预期的那样 我最终得到了一个黑人寄宿生 但我最终也没有标题按钮 从微软我了解到我可以通过将窗口样式设置为 null 来使用标准窗口来克
  • DQL 查询返回:预期 StateFieldPathExpression 或 SingleValuedAssociationField

    我有以下 DQL 查询 public function findByIdJoinedToCodeExample pageId query this gt getEntityManager gt createQuery SELECT c FR
  • 将 super 与 class_eval 一起使用

    我有一个应用程序 其中包含用于添加客户端自定义的核心类模块 我发现 class eval 是重写核心类中方法的好方法 但有时我想避免重写整个方法 而只是遵循原始方法 例如 如果我有一个名为account balance 最好在我的模块 即包