4

Ruby ができることを知らなかった 10 のことのスライド 30 で、ジェームズ・エドワード・グレイ 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 に答える