Доступна ли информация, отображаемая в 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 (хотя любой метапрограммированный код не будет проанализирован, так как он еще не существует).