ASTを歩くために使用される Visitor パターンを見てきました。accept(visitor)
このパターンを使用するには、AST ノード オブジェクトにメソッドを追加します。このメソッドはvisitor.visit(self)
、ノードを「処理」して目的の結果 (AST のプリティプリント バージョンなど) を取得する呼び出しを呼び出します。
通常、メソッドを追加するにはノード自体を変更する必要があることに注意してください。しかし、AST が組み込みオブジェクトを使用している場合はどうでしょう。Ruby の Ripper ライブラリは、配列の配列として AST を返します。accept
次のようにメソッドを追加できます。
class Array
def accept(visitor)
visitor.visit(self)
end
end
Arrayのドキュメントを見ると、現在メソッドがaccept
ないため、競合は発生しません。しかし、特に自分でライブラリを作成している場合、これは私には適切ではありません。他の人が依存している可能性のある組み込みオブジェクトを「汚染」したくありません。
ただし、これは Ruby に限ったことではなく、C# で拡張メソッドを追加して同様のことを行うことができます。
私の質問は次のとおりです。このシナリオで Visitor パターンを使用する必要がありますか、それとも、作業中のデータ型を単純に取り込んで必要な答えを返す再帰関数を作成する必要がありますか?