class Prism::Dispatcher

调度器类为在遍历 AST 时找到的节点向所有注册的侦听器触发事件。它对于在 AST 上执行不同类型的分析非常有用,而只需要遍历一次树。

要使用调度器,您首先需要实例化它并为感兴趣的事件注册侦听器

class OctalListener
  def on_integer_node_enter(node)
    if node.octal? && !node.slice.start_with?("0o")
      warn("Octal integers should be written with the 0o prefix")
    end
  end
end

listener = OctalListener.new
dispatcher = Prism::Dispatcher.new
dispatcher.register(listener, :on_integer_node_enter)

然后,您可以遍历任意数量的树,并将事件分派给侦听器

result = Prism.parse("001 + 002 + 003")
dispatcher.dispatch(result.value)

或者,您还可以使用“#dispatch_once”来为单个节点分派进入和离开事件,而无需进一步递归到树中。这在您想重用已注册的侦听器,但又想在特定点停止遍历树的情况下非常有用。

integer = result.value.statements.body.first.receiver.receiver
dispatcher.dispatch_once(integer)