加上一句「;资料来源;使用Rubinius将属性设置为ruby对象

加上一句「;资料来源;使用Rubinius将属性设置为ruby对象,ruby,compiler-construction,rubinius,Ruby,Compiler Construction,Rubinius,我试图(为了好玩和赚钱)添加在ruby中检查对象并发现其源代码的功能。不是生成的字节码,也不是内部表示的反编译版本,而是解析以创建该对象的实际源代码 我很晚才知道鲁宾尼乌斯的事,虽然我还没有完全清醒过来,但我认为我已经取得了一些进展 不过,我很难弄明白怎么做。我的第一种方法是简单地向AST结构添加另一个实例属性(例如,ClosedScope对象)。然后,在运行时解释字节码时,以某种方式再次拉出该属性 这似乎是一个合理的方法吗?您有没有调查过Pry?它是一个Ruby解释器/调试器,声称能够按照您的

我试图(为了好玩和赚钱)添加在ruby中检查对象并发现其源代码的功能。不是生成的字节码,也不是内部表示的反编译版本,而是解析以创建该对象的实际源代码

我很晚才知道鲁宾尼乌斯的事,虽然我还没有完全清醒过来,但我认为我已经取得了一些进展

不过,我很难弄明白怎么做。我的第一种方法是简单地向AST结构添加另一个实例属性(例如,ClosedScope对象)。然后,在运行时解释字节码时,以某种方式再次拉出该属性


这似乎是一个合理的方法吗?

您有没有调查过Pry?它是一个Ruby解释器/调试器,声称能够按照您的要求执行操作。

正如Samuel先生所说,您可以使用pry并执行
显示源代码foo
。但也许你想知道它在引擎盖下是如何工作的

Ruby提供了两个有用的功能:首先,您可以获得对象上所有方法的列表。只需调用
foo.methods
。其次,它为每个方法提供文件名和行号属性

为了找到一个对象的完整源代码,我们扫描了所有的方法,并根据它们定义的位置对它们进行分组。然后我们将文件扫描回来,直到看到
class
module
或rubyists用来定义方法的一些其他方式。然后,我们向前扫描每个文件,直到识别出整个类/模块定义


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

请求其他人。您是否尝试过设置跟踪功能?它不是鲁宾尼乌斯特有的,但会按照你的要求去做,并且不是基于普赖尔或其他宝石


请参见

您打算如何处理已扩展一次以上的类?我可以看到每个方法附带的源代码中的潜力,但在类级别上,如果不先解决方法的问题,它似乎是有问题的,我应该补充一点,我正在寻找一些不是基于控制台的东西——我希望解释器能够真正支持检查AST。我的最终目标是能够将所有用户定义的对象从内存序列化到文件系统上。我也许可以通过破解pry来做到这一点……只要重用pry中符合您需求的部分——或者从中寻找灵感:有人能解释我为什么被否决吗?我真的认为set_trace_func解决了这个问题,它是内置的。
set_trace_func
所做的就是每次执行一行ruby时执行一个进程。如何使用它来恢复对象的源代码一点也不明显,至少你的答案需要更多的解释,最坏的情况是——你的答案根本没有帮助,因为
set\u trace\u func
甚至不相关。