元编程:以文本形式输出方法体

2024-04-15

我在模块中动态定义一个方法,并且我想检查一旦该方法绑定到一个类实例,该方法的主体就是我所期望的。有没有办法输出(作为文本)方法体?

Module controller_mixins.rb:

module ControllerMixin

  instance_eval "def search_by_vendor (*args) \n" \
    " @#{self.class.name.sub(/Controller/, '').tableize} = #{self.class.name.sub(/Controller/, '')}.find_all_by_vendor_id(params[:vendor_id])  \n"\
    "respond_to do |format| \n" \
    " format.html { render :template=>'/#{self.class.name.sub(/Controller/, '').tableize}/index',  :layout=>'vendor_info'} \n" \
    " format.xml  { render :xml => @#{self.class.name.sub(/Controller/, '').tableize} } \n" \
    "end \n"\
  "end \n"

end

类与以下内容混合:

class VendorOrdersController < ApplicationController
  # GET /vendor_orders
  # GET /vendor_orders.xml
  require 'controller_mixins'
  include ControllerMixin
 <rest of class>

所以我想看看 mixin 应用于时的实现VendorOrdersController可能通过script/console为了方便。

更新:根据 @~/ 我将字符串保存到变量中并puts做到了。效果非常好。这暴露了我的代码中的一个错误(这就是我首先想查看代码的原因)。下面的代码要好得多,并且按预期工作。

module ControllerMixin

  def self.included(mod)
     method_body = "def search_by_vendor \n" \
      " @#{mod.name.sub(/Controller/, '').tableize} = #{mod.name.sub(/Controller/, '')}.find_all_by_vendor_id(params[:vendor_id])  \n"\
      "respond_to do |format| \n" \
      " format.html { render :template=>'/#{mod.name.sub(/Controller/, '').tableize}/index',  :layout=>'vendor_info'} \n" \
      " format.xml  { render :xml => @#{mod.name.sub(/Controller/, '').tableize} } \n" \
      "end \n"\
    "end \n" 

    puts method_body
    mod.class_eval(method_body)
  end

end

不,您无法获取方法背后的源代码。

你能做的最好的就是得到Method表示使用方法的对象Object#method。例如:

m = VendorOrdersController.method(:search_by_vendor)

但你会发现除了一个Method#name, Method#arity, Method#source_location, etc.

但是,在您的情况下,为什么不简单地将字符串存储在变量中,在使用之前打印它instance_eval?

无论如何,你的instance_eval将在模块声明时执行。你可能想把它包裹在一个included回调以使其在包含时执行。

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

元编程:以文本形式输出方法体 的相关文章

随机推荐

  • 按 Option 键隐藏/显示应用程序主菜单中的菜单项

    我想在应用程序的主菜单中添加一个很少使用的菜单项 我希望它默认隐藏 仅当用户按住 Option 键时才显示 我该怎么做呢 看来我应该处理flagsChanged 但它是NSResponder的方法和NSMenu不继承自NSResponder
  • 为什么使用 boost 后 C++ 比 python 快得多?

    我的目标是用 Python 编写一个用于频谱有限元的小型库 为此我尝试使用 Boost 通过 C 库扩展 Python 希望它能让我的代码更快 class Quad public Quad int int double integrate
  • 将 TDD 与 Web 应用程序开发集成的最佳实践? [关闭]

    Closed 这个问题是基于意见的 help closed questions 目前不接受答案 单元测试和 ASP NET Web 应用程序在我的团队中是一个模棱两可的点 通常情况下 良好的测试实践会被忽视 Web 应用程序最终会在没有测试
  • 如何对库进行临时签名?

    尝试运行链接到动态库的可执行文件 出现以下错误 Library not loaded Reason tried
  • 为什么小于不起作用?

    这看起来很简单 但为什么这种比较不起作用呢 if nmax lt num nmax num 我把它放在一个循环中 寻找最大的数字 第一个数字是105 然后是89 然后是99 然后是一大堆大于99的数字 第一个数字是要测试的数字 第二个数字是
  • GWT:对RichTextArea进行文本限制并阻止用户输入更多字符

    我正在使用 GWT RixhText Area 并希望在 richText Area 中限制 100 个字符 现在我正在做这个 description addKeyDownHandler new KeyDownHandler Overrid
  • Elastic Beanstalk 剥离 Sec-WebSocket-Accept 标头

    我正在尝试让 NET Core 应用程序在 elastic beanstalk 上运行 以从浏览器中的 javascript 接收 websockets 连接 当我在本地计算机上测试 AWS 之外的客户端和服务器时 我能够在两者之间建立 W
  • 数据流:将 Top 模块与 Python SDK 结合使用:单元素 PCollection

    我正在查看 incubator beam 存储库上的 word counting py 示例 从数据流文档链接 我想修改它以获得n 出现次数最多的 这是我的管道 counts lines split gt gt beam ParDo Wor
  • Java中如何初始化日期类型变量?

    import java util Date Date firstDate 我不知道如何初始化firstDate例如对于你说的字符串 String line1 First line 但是日期的格式是什么 你能给我一个例子吗 以下是 Oracl
  • Python 中海量 numpy 数组的内存高效排序

    我需要使用 numpy 对非常大的基因组数据集进行排序 我有一个 26 亿个浮点数的数组 维度 868940742 3 加载后 它会占用我机器上大约 20GB 的内存 我有一台 2015 年初的 13 英寸 MacBook Pro 配备 1
  • 谷歌闭包编译器和json

    我有一个 json 字符串 我会解析它 然后使用点符号访问对象的属性 然而 在 google 闭包编译器中 点符号 MyObject PropertyName 给出该属性未定义的警告 目前 我使用的解决方案是将我的代码转换为括号表示法 My
  • Shouldly 断言库如何知道断言所应用到的表达式?

    The 适用于 NET 的 Shouldly 断言库 http shouldly readthedocs io en latest 以某种方式知道断言方法被调用的表达式 因此它能够将其显示到消息中 我试图找出它是如何工作的 但迷失在源代码中
  • spring + SQLite在多线程应用程序中

    我正在开发一个使用 SQLite 数据库和 spring 的应用程序 当多个线程尝试修改数据库时遇到问题 我收到错误 数据库文件被锁定 我配置了一个数据源
  • python-requests 和 django - CSRF 验证失败。请求已中止

    我有一个 django 服务器来上传文件 当我使用浏览器时 我可以毫无问题地上传文件 但是如果我使用 python requests 命令 它会告诉我 CSRF 验证失败 请求被中止 python请求代码如下 upload via HTTP
  • 从 stdin、C 读取未知行数

    我在读取未知大小的标准输入时遇到问题 事实上 它是 txt 文件中的一个表 我通过调用参数 include
  • 整数最小值和最大值

    我是编程新手 我正在学习一本Java对象编程书籍 并在计算机上同时执行书中的教程和示例 书中说整数的最大值和最小值是 Integer MAX VALUE 2147483647 Integer MIN VALUE 2147483648 那么好
  • 如何在不关闭 AdGuard 的情况下让 Flutter 工作

    当我跑步时flutter doctor v 出现以下日志 Unhandled exception Bad state Future already completed 0 AsyncCompleter complete dart async
  • move_uploaded_file 出现错误 HTTP 包装器不支持可写连接

    我目前正在做一个 php 项目 这里我想使用将图像存储到文件夹中move uploaded file但是当我使用以下代码时 if move uploaded file FILES file promo image tmp name uplo
  • 测试 Angular 2 中“(window:resize)”事件触发的函数

    我正在尝试测试由窗口调整大小事件触发的函数 使用 Karma 在现实世界中一切正常 但是当我尝试在测试中手动触发事件时 该函数永远不会被调用 这会导致测试失败 这是我的 HTML div class navbar navbar grayli
  • 元编程:以文本形式输出方法体

    我在模块中动态定义一个方法 并且我想检查一旦该方法绑定到一个类实例 该方法的主体就是我所期望的 有没有办法输出 作为文本 方法体 Module controller mixins rb module ControllerMixin inst