gpt4 book ai didi

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

转载 作者:数据小太阳 更新时间:2023-10-29 08:28:09 26 4
gpt4 key购买 nike

我正在尝试(为了乐趣和利润)添加检查 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/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com