3

我目前正在为 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 的核心。所以,我正在编写一个插件,用我自己的实现替换这个方法,它做同样的事情,但是三个变成了六个。

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

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

4

2 回答 2

1

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

于 2013-09-24T22:26:53.703 回答
1

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

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

于 2013-09-24T23:27:24.867 回答