2012-11-01 24 views
4

10 Things You Didn't Know Ruby Could Do,滑动30,詹姆斯·爱德华·格雷II提到信息显示在ruby --dump在运行时是否可用?

ruby -e 'puts { is_this_a_block }' --dump parsetree 

产生

########################################################### 
## Do NOT use this node dump for any purpose other than ## 
## debug and research. Compatibility is not guaranteed. ## 
########################################################### 

# @ NODE_SCOPE (line: 1) 
# +- nd_tbl: (empty) 
# +- nd_args: 
# | (null node) 
# +- nd_body: 
#  @ NODE_ITER (line: 1) 
#  +- nd_iter: 
#  | @ NODE_FCALL (line: 1) 
#  | +- nd_mid: :puts 
#  | +- nd_args: 
#  |  (null node) 
#  +- nd_body: 
#   @ NODE_SCOPE (line: 1) 
#   +- nd_tbl: (empty) 
#   +- nd_args: 
#   | (null node) 
#   +- nd_body: 
#    @ NODE_VCALL (line: 1) 
#    +- nd_mid: :is_this_a_block 

这里输出在运行时可用的信息?如果是这样,那么这些信息仅代表哪些代码已被写下,或者它是否也具有已完成的任何元编程的结果?

回答

3

是的。您可以使用Ripper gem(包含开箱即用的MRI 1.9)为给定的代码字符串(通过Ripper.sexp)生成AST(抽象语法树)。但是,由于MRI 1.9中的体系结构更改,一旦将代码解析并翻译为YARV字节码,原始源代码和AST都将被丢弃,您将不再能够获取此信息。但是,如果您将通过元编程生成的任何代码放入Ripper.sexp中,则可以获得结果的AST。您也可以使用JEG2演讲中显示的一些其他技巧来解析源文件并为其生成一个AST(尽管任何元编程的代码将不会被解析,因为它还不存在)。

相关问题