带有预定义关键字参数的define_method

2024-02-20

我想定义一个采用关键字参数的方法。我希望它在未提供关键字参数时引发,并且我可以自己编写代码 - 但理想情况下我想让 Ruby 为我做这件事。另外我希望能够使用检查新定义的方法Method#parameters。如果我使用速记 double-splat (比如**kwargs)我期望的实际结构是不可见的parameters.

我当然可以这样做:

define_method(:foo) do | foo:, bar: |
  # ...
end

从而达到预期的结果:

method(:foo).parameters
# => [[:keyreq, :foo], [:keyreq, :bar]]

但我无法以编程方式传递这些参数,它们必须按字面意思放置在代码中。有什么办法可以绕过这个吗?


你必须使用eval动态定义参数(不仅仅是关键字参数),例如使用class_eval http://ruby-doc.org/core-2.2.2/Module.html#method-i-class_eval:

class MyClass
  name = :foo
  args = [:bar, :baz]
  class_eval <<-METHOD, __FILE__, __LINE__ + 1
    def #{name}(#{args.map { |a| "#{a}:" }.join(', ')}) # def foo(bar:, baz:)
      [#{args.join(', ')}]                              #   [bar, baz]
    end                                                 # end
  METHOD
end

MyClass.new.foo(bar: 1, baz: 2)
#=> [1, 2]

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

带有预定义关键字参数的define_method 的相关文章

随机推荐

  • IllegalArgumentException:无法从当前目标找到导航操作/目标包名称/action_xxx

    当我尝试在视图页面中从一个片段导航到另一个片段时 我遇到了 Android 导航架构组件的问题 出现以下错误 java lang IllegalArgumentException Navigation action destination
  • 超时过期,优化查询

    我有这个查询来获取两个日期之间账单的所有详细信息 SELECT DT FROM DetailTable DT BillTable BT PackageTable PT WHERE PT Id BT IdPackage AND DT IdBi
  • Angular2:发出请求时如何从客户端向服务器发送数据

    客户端有一个表单和一个按钮 我想将用户在表单中输入的数据发送到服务器 其中有将数据保存到数据库以及从数据库到客户端的请求处理程序 我该怎么做我对逻辑感到困惑 我认为使用了主体解析器 还有标头的作用是什么 在这种情况下请求选项 我找到了该解决
  • 在 CQL Cassandra 中查找非主键列的不同值

    我使用以下代码来创建表 CREATE KEYSPACE mykeyspace WITH REPLICATION class SimpleStrategy replication factor 1 USE mykeyspace CREATE
  • UISearchBar 代替 UINavigationController UINavigationBar

    我有一个UITableViewController with a UISearchDisplayController and UISearchBar 包含在UINavigationController作为根元素 是否可以这样配置UISear
  • 如何修复 microk8s 上的“无法拉取镜像”

    我正在尝试遵循 docker 入门教程 但是当您必须使用 kubernetes 时 我会陷入困境 我正在使用 microk8s 创建集群 我的 Dockerfile FROM node 6 11 5WORKDIR usr src app C
  • 如何使用 Kibana 3 创建价值随时间变化的图表?

    我使用 Logstash 来存储包含车辆随时间变化的速度的日志文件 在 Kibana 3 中 如何生成一个显示随时间变化的值的面板 即 x 轴显示时间 y 轴显示相关值 例如车辆速度 我发现的大多数面板都会计算给定时间范围内事件的发生次数并
  • Tomcat 7 - 保护 webapps 文件夹下的文件夹

    我的网络应用程序是 myweb 在此网络应用程序中 我的代码引用 files 文件夹下的 123 pdf 例如 http localhost 8080 files 123 pdf webapps myweb files 123 pdf 当我
  • NodeJS:如何像C#一样生成Rfc2898DeriveBytes?

    我正在尝试使用 NodeJS 加密库和 C Rfc2898DeriveBytes 生成相同的密码哈希 使用 C 生成的 salt 时 NodeJs 实现不会生成相同的密钥 我究竟做错了什么 在 C 中 public static strin
  • symfony2 主义 onetoone 完整示例

    我尝试从示例中建立onetoone关系 http docs doctrine project org en latest tutorials composite primary keys html use case 2 simple dri
  • SQL Server 通知 - 我的 OnChange 不触发

    我想利用 SQL Server 通知来捕获 winforms 应用程序中数据库中的插入事件 我正在尝试使用 SQLDependency 对象 MSDN 文章使这看起来非常简单 所以我创建了一个小示例应用程序来尝试一下 该事件似乎仅在我第一次
  • HTML 表格列宽:固定宽度和可变宽度的结合

    我做了一个这样的表格 table style width 100 tr td aaa td td td td class fixed width bbb td td class fixed width ccc td tr table 我将如
  • Pycharm 中模板的自动完成功能

    每当我创建一个函数 将其设为视图并将模板映射到其上时 PyCharm 中的自动完成功能都会起作用 如果您输入类似的内容 book where book是一个模型 并且是您的上下文对象之一 那么它将为您提供一个包含可能完成的下拉菜单 但是 如
  • rand() 在 OS X Mavericks/XCode 5.1 上损坏? (或者,“这是一个巨大的安全漏洞,还是我只是一个糟糕的程序员?”)[重复]

    这个问题在这里已经有答案了 以下代码片段随机打乱 STL 整数数组 它在 Ubuntu 和 Red Hat 上都能正常工作 然而 在我的 Mac OS X 机器上 数组每次都会按照相同的顺序进行洗牌 代码的第二部分打印随机数生成器的输出 这
  • IronRuby 性能?

    虽然我知道 IronRuby 还没有准备好让全世界使用它 但我想知道这里是否有人尝试过它并测试它在原始性能方面与其他红宝石相比的表现如何 如果是这样 结果是什么 您是如何衡量性能的 哪些基准等 Edit IronRuby 团队维护了一个网站
  • 如何在剃刀代码块中插入空格?

    VS2013 MVC5 剃刀 VB 我希望 已答复 一词前面有空格 如何在以下 Razor 代码块中强制添加空格 Code If Model DisplayAnsweredFlag Then If Model Answered Then H
  • 将 python3.5 设置为 AWS 中的默认值?

    有没有办法让python3 5成为AWS中的默认python 每次我尝试下一次连接时 python2 7 是默认版本 pip 6 是最后一个版本 知道我在几分钟前更新了它 这是我遵循的方法 亚马逊 链接 http docs aws amaz
  • 了解 gsl::narrow 实现

    The C 核心指南 https github com isocpp CppCoreGuidelines blob master CppCoreGuidelines md has a narrow如果强制转换更改了值 则会抛出异常 看着微软
  • SELECT * 中有时会缺少计算列

    在 SQL Azure 中 我有一个或多或少像这样设置的表 其中有两个计算列 IsExpired and IsDeadlineExpired 简单地将不可为 null 的日期时间列与当前时间进行比较 CREATE TABLE dbo Stu
  • 带有预定义关键字参数的define_method

    我想定义一个采用关键字参数的方法 我希望它在未提供关键字参数时引发 并且我可以自己编写代码 但理想情况下我想让 Ruby 为我做这件事 另外我希望能够使用检查新定义的方法Method parameters 如果我使用速记 double sp