我正在尝试(为了乐趣和利润)添加检查 ruby 对象并发现其源代码的能力。不是生成的字节码,也不是内部表示的某些反编译版本,而是经过解析以创建该对象的实际源代码。
我很晚才开始学习 Rubinius,虽然我还没有完全了解它,但我认为我已经取得了一些进步。
不过,我在弄清楚如何执行此操作时遇到了麻烦。我的第一种方法是简单地向 AST 结构添加另一个实例属性(例如,一个 ClosedScope 对象)。然后,在运行时解释字节码时,以某种方式再次提取该属性。
这看起来是一个合理的方法吗?
最佳答案
正如 Samuel 先生所说,您可以使用 pry 并执行 show-source foo
。但也许您想知道它是如何工作的。
Ruby 提供了两个有用的东西:首先,您可以获得对象上所有方法的列表。只需调用 foo.methods
。其次,它为每个方法提供了一个 file_name 和 line_number 属性。
为了找到一个对象的完整源代码,我们扫描所有方法并根据它们的定义位置对它们进行分组。然后我们向上扫描文件,直到我们看到 class
或 module
或 rubyists 用来定义方法的其他几种方式。然后我们在每个文件中向前扫描,直到我们识别出整个类/模块定义。
正如 dgitized 指出的那样,如果人们对核心对象进行猴子修补,我们通常会得到多个这样的定义。默认情况下 pry 只显示包含大多数方法的模块定义;但您可以使用 show-source -a
请求其他人。
关于ruby - 使用 Rubinius 向 ruby 对象添加 "source"属性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13435730/