Доступна ли информация, отображаемая в ruby ​​--dump, во время выполнения?

Джеймс Эдвард Грей II рассказывает о 10 вещах, которые вы не знали

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

Доступна ли выводимая здесь информация во время выполнения? Если да, то представляет ли информация только то, какой код был записан, или она также имеет результаты какого-либо выполненного метапрограммирования?

1 ответ

Ага. Вы можете использовать гем Ripper (который входит в комплект поставки MRI 1.9) для генерации AST (абстрактного синтаксического дерева) для данной строки кода (через Ripper.sexp). Однако из-за архитектурных изменений в MRI 1.9, когда ваш код будет проанализирован и переведен в байт-код YARV, и исходный код, и AST будут удалены, и вы больше не сможете получить эту информацию. Однако, если вы добавите любой код, который вы сгенерировали бы с помощью метапрограммирования, в Ripper.sexp Вы можете получить AST результата. Вы также можете использовать некоторые другие приемы, показанные в выступлении JEG2, для синтаксического анализа в исходном файле и создания для него AST (хотя любой метапрограммированный код не будет проанализирован, так как он еще не существует).

Другие вопросы по тегам