[英]Is the information displayed in ruby --dump available at runtime?
在你不知道Ruby可能做的10件事中 ,滑動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
此處輸出的信息是否在運行時可用? 如果是這樣,信息是僅僅代表已經寫下的代碼,還是它還具有已經完成的任何元編程的結果?
是的。 您可以使用Ripper gem(包含MRI 1.9開箱即用)為給定的代碼字符串生成AST(抽象語法樹)(通過Ripper.sexp
)。 但是,由於MRI 1.9中的體系結構更改,一旦您的代碼被解析並轉換為YARV字節碼,原始源和AST都將被丟棄,您將無法再獲取此信息。 但是,如果您將通過元編程生成的任何代碼放入Ripper.sexp
您可以獲得結果的AST。 您還可以使用JEG2演講中顯示的一些其他技巧來解析源文件並為其生成AST(盡管任何元編程代碼都不會被解析,因為它還不存在)。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.