【问题标题】:How can I call 'super' from 'define_method'? [duplicate]如何从“define_method”中调用“super”? [复制]
【发布时间】:2017-01-11 00:27:03
【问题描述】:

我正在尝试将binding.remote_pry 添加到我的应用程序的所有类的所有方法中,以用于测试环境。

我试试这个:

classes = []
ObjectSpace.each_object { |o| classes << o if o.class == Class }
classes.each do |classe|
    classe.methods.each do |method_name|
        classe.class_eval do
            define_method(method_name.to_sym) do
                @@bindings ||= []
                @@bindings << Thread.new {binding.remote_pry}
                super
            end
        end
    end
end

但是我不知道如何调用define_method里面每个方法的super 我想在这里做一些太疯狂的事情吗? 还有另一种方法吗?提前致谢

【问题讨论】:

  • 绝对是一些疯狂的事情。再次致电super 有什么问题?
  • 仅供参考:classes = ObjectSpace.each_object.select { |o| o.class == Class }
  • RuntimeError: 不支持从由 define_method() 定义的方法传递 super 的隐式参数。明确指定所有参数。
  • @Cassiano 查看链接的副本。它概述了实现这一目标的许多方法。
  • 非常感谢。下次我会努力搜索的。

标签: ruby-on-rails ruby metaprogramming remote-debugging test-environments


【解决方案1】:

您应该使用显式的空参数列表调用它,否则super 会尝试从原始方法传递参数,这不适用于define_method 定义的方法。做吧:

super()

你应该没事;)

【讨论】:

  • 你没抓住重点,super 在这里帮不上忙。这不是您调用要覆盖的方法的方式。
  • 嗯,它回答了“我如何从'define_method'中调用'super'?”的问题。所以我不明白它是如何错过重点的。 OP 会遇到另一个错误,这将引导他朝着实现目标的方向前进。但当然适合自己投反对票。
  • 如果你给人们的建议指向错误的方向,却没有真正解释为什么尝试的方法不起作用,你就没有帮助。如果您不相信它会真正解决问题,请不要添加答案。
猜你喜欢
  • 1970-01-01
  • 2013-12-12
  • 1970-01-01
  • 2020-04-06
  • 2014-11-13
  • 2021-07-29
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多