我正在使用抽象語法樹,其中每個頂點都是Node
類的子類。這個基類在第三方庫中定義,並且對象在施工時被凍結。凍結對象中的記憶方法
現在我正在執行一些遍歷樹的昂貴的操作,有時是遞歸的,並且想記憶這些操作的結果。下面是這樣一個子類,和運算結果的一個例子使用「經典」紅寶石圖案被memoized:
class DefNode < Node
def visibility_scope
@visibility_scope ||= VisibilityScopeResolver.new(self).resolve
end
end
然而,由於Node
構造凍結對象嘗試分配給一個實例變量導致錯誤:
DefNode.new(children).visibility_scope
#=> RuntimeError: can't modify frozen DefNode
有沒有一種方法(自然)執行memoization凍結對象?理想情況下,不要覆蓋每個子類中的構造函數。