ruby - 从 Ruby block 中提取 AST

标签 ruby reflection abstract-syntax-tree ruby-1.9.2

是否可以从 Ruby 本身获取 block 的 AST?

我看过 ParseTree 和 ruby​​_parser,但它们似乎都对 Ruby 1.9.2 有粗略的支持(根据我的阅读)。我需要适合 1.9.2 的东西。

最佳答案

Ripper 包含在 MRI 1.9 中,开箱即用。

ruby-1.9.2-p180 :004 > require 'ripper'
 => true
ruby-1.9.2-p180 :005 > Ripper.sexp("def a; end")
 => [:program, [[:def, [:@ident, "a", [1, 4]], [:params, nil, nil, nil, nil, nil], [:bodystmt, [[:void_stmt]], nil, nil, nil]]]] 

在 1.8 中,Ruby 通过遍历 AST 来执行代码,因此可以获得给定方法/ block 的 AST。在 1.9 中不是这样;代码首先被解析,然后转换为 YARV 字节码,然后执行。在翻译步骤之后不保留源代码,也不保留 AST,后者是不可逆的;因此你无法在 1.9 中获取 block 的 AST。

关于ruby - 从 Ruby block 中提取 AST,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6894763/

相关文章:

ruby-on-rails - 在 rails 中创建自定义路线

java - 如何获取嵌套字段

python - 成员变量的注解在哪里

ruby - 将barby gem生成的条码嵌入到 Prawn 文档中

ruby - 使用 Mechanize 更改表单选择字段不起作用(Ruby)

ruby - 为什么范围#include?比大于或小于运算符慢得多

.net - 为什么指针是引用类型?

bash - 如何找到定义 bash 函数的位置?

erlang - 将 Elixir AST 转换为 Erlang AST?是否可以?

java - CompilationUnit 中所有变量的 IField