我見過用於走AST的訪客模式。要使用此模式,您需要在AST節點對象上添加一個accept(visitor)
方法。這個方法調用visitor.visit(self)
,它反過來「處理」節點以獲得期望的結果(例如AST的漂亮版本)。當我的AST只是一個數組數組時,我應該使用Visitor嗎?
注意,你通常需要修改節點本身來添加方法。但是,如果AST正在使用內置對象呢? Ruby的Ripper庫將AST作爲數組返回。我可以添加accept
方法如下:
class Array
def accept(visitor)
visitor.visit(self)
end
end
望着documentation for Array,目前還沒有accept
方法,所以不會有衝突。但是,這並不適合我,特別是如果我自己寫一個圖書館。我不想「污染」其他人可能依賴的內置對象。
這並不是Ruby所特有的,不過,因爲我可以在C#中添加一個擴展方法做類似的事情。
我的問題是:我應該使用Visitor模式在這種情況下,或者我應該寫一個遞歸函數,僅僅發生在我工作的數據類型,並返回我想要的答案?
也許這是處理的最佳方式。至少我的部分問題是要求替代方案,如果訪問者不是正確的處理方法。我得考慮一下你的策略。 – 2011-03-08 14:24:04
手頭的問題是相同類型數組的所有元素,還是它們具有不同的子類型? – 2011-03-08 21:43:23