4

你不知道 Ruby 可以做的 10 件事中,幻灯片 30,James Edward Gray II 提到

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

这里输出的信息在运行时可用吗?如果是这样,这些信息是否仅代表已写下的代码,还是包含已完成的任何元编程的结果?

4

1 回答 1

3

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

于 2012-11-11T04:51:15.470 回答