在10 Things You Didn't Know Ruby Could Do幻灯片30中,詹姆斯爱德华格雷二世提到
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
此处输出的信息是否可在运行时获得?如果是这样,那么这些信息仅仅代表了哪些代码被记录下来,或者它是否也有任何元编程的结果?
答案 0 :(得分:3)
是的。您可以使用Ripper gem(包含在MRI 1.9中的开箱即用)为给定的代码字符串生成AST(抽象语法树)(通过Ripper.sexp
)。但是,由于MRI 1.9中的体系结构更改,一旦您的代码被解析并转换为YARV字节码,原始源和AST都将被丢弃,您将无法再获取此信息。但是,如果您将通过元编程生成的任何代码放入Ripper.sexp
,您可以获得结果的AST。您还可以使用JEG2对话中显示的其他一些技巧来解析源文件并为其生成AST(尽管任何元编程代码都不会被解析,因为它还不存在)。