ruby - 使用 Rubinius 向 ruby​​ 对象添加 "source"属性

标签 ruby compiler-construction rubinius

我正在尝试(为了乐趣和利润)添加检查 ruby​​ 对象并发现其源代码的能力。不是生成的字节码,也不是内部表示的某些反编译版本,而是经过解析以创建该对象的实际源代码。

我很晚才开始学习 Rubinius,虽然我还没有完全了解它,但我认为我已经取得了一些进步。

不过,我在弄清楚如何执行此操作时遇到了麻烦。我的第一种方法是简单地向 AST 结构添加另一个实例属性(例如,一个 ClosedScope 对象)。然后,在运行时解释字节码时,以某种方式再次提取该属性。

这看起来是一个合理的方法吗?

最佳答案

正如 Samuel 先生所说,您可以使用 pry 并执行 show-source foo。但也许您想知道它是如何工作的。

Ruby 提供了两个有用的东西:首先,您可以获得对象上所有方法的列表。只需调用 foo.methods。其次,它为每个方法提供了一个 file_name 和 line_number 属性。

为了找到一个对象的完整源代码,我们扫描所有方法并根据它们的定义位置对它们进行分组。然后我们向上扫描文件,直到我们看到 classmodule 或 ruby​​ists 用来定义方法的其他几种方式。然后我们在每个文件中向前扫描,直到我们识别出整个类/模块定义。

正如 dgitized 指出的那样,如果人们对核心对象进行猴子修补,我们通常会得到多个这样的定义。默认情况下 pry 只显示包含大多数方法的模块定义;但您可以使用 show-source -a 请求其他人。

关于ruby - 使用 Rubinius 向 ruby​​ 对象添加 "source"属性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13435730/

相关文章:

c++模板到模板参数

c++ - 在 Arduino IDE 中链接预建对象

parsing - 编译器: is implicit type conversion considered in parsing or semantic analysis?

ruby - 为什么尾递归 gcd 比 rubinius 的 while 循环更快

ruby - 通过运行 unix 命令在 ruby​​ 中创建 zip 文件,请不要使用 gems

javascript - 将柯里化(Currying)函数从 Rails 传递到 JavaScript

ruby-on-rails - Ruby on Rails 用于开发实时应用程序?还是 Node.js?

python - 转字符串方法的 Ruby 版本

ruby - MRI Ruby 和 jRuby 的性能差异

ruby - Rubinius 中的 mixins 在哪里实现?