【问题标题】:Is there a way to check what's inside method's code in Ruby or even modify it?有没有办法检查 Ruby 中方法代码的内容,甚至修改它?
【发布时间】:2013-09-24 20:51:02
【问题描述】:

我目前正在为 Redmine 创建一个我自己的插件。我在其核心中找到了以下方法(不是确切的代码,但保留了这个想法):

def method(foo, bar, array)
    # Do some complex stuff with foo and bar

    @array = array
    @array.uniq!
    @array = @array[0:3]

    # Do some complex weird stuff with @array
end

我必须将这个“3”更改为“6”,因为数组中的三个元素不足以满足我的插件的目的。我可以手动更改它并且没有崩溃,但我不想修补 Redmine 的核心。所以,我正在编写一个插件,用我自己的实现替换这个方法,它做同样的事情,但是三个变成了六个。

问题是:如果此文件更新,将使用过时的方法。有什么方法可以在运行时检查方法内部写入的内容(例如,当服务器启动时)?

顺便问一下,有没有什么方法可以直接修改这个常量而不覆盖整个方法呢?

【问题讨论】:

  • 我想要一个实际的答案,发布实际代码,而不是一些伪代码(尤其是在处理一个相当知名的开源系统时。)

标签: ruby reflection runtime redmine


【解决方案1】:

如果您能够访问该文件,那么您可以使用 pry gem 来检查源代码。或者没有这样的 gem,您可以通过 puts method(:foo).source_location 手动检查方法的位置,然后阅读该部分。

更改行为最简单的方法是覆盖整个方法。

【讨论】:

    【解决方案2】:

    不,在 Ruby 中无法在运行时获取方法的源代码。在某些 Ruby 实现中,可能有一种方法可以获取在某些时候有效的源代码,但这既不可靠也不可移植。毕竟,甚至不能保证源代码是 Ruby,因为大多数实现都允许您使用 Ruby 以外的语言编写方法(例如 YARV 中的 C、JRuby 中的 Java 等)

    【讨论】:

      猜你喜欢
      • 2020-02-09
      • 2014-12-05
      • 1970-01-01
      • 2016-03-26
      • 2021-11-18
      • 1970-01-01
      • 2021-09-26
      • 2018-04-25
      • 2019-10-01
      相关资源
      最近更新 更多