4
假設我們有兩個模塊:一個定義一個對象,另一個定義一個ObjectFactory。 Object需要訪問ObjectFactory的一些函數,並且ObjectFactory需要訪問Object才能實例化Object。在Nim中做循環依賴的有效方法
如果Object在模塊中實現並且ObjectFactory在另一個模塊中實現,那麼在Nim中解決這個問題的方法是什麼?
假設我們有兩個模塊:一個定義一個對象,另一個定義一個ObjectFactory。 Object需要訪問ObjectFactory的一些函數,並且ObjectFactory需要訪問Object才能實例化Object。在Nim中做循環依賴的有效方法
如果Object在模塊中實現並且ObjectFactory在另一個模塊中實現,那麼在Nim中解決這個問題的方法是什麼?
我假設這裏的問題是相互遞歸的類型,即兩個或多個類型的聲明彼此引用的地方。相互引用的方法或過程通過相互遞歸導入來處理,儘管在這種情況下必須小心模塊初始化。
正如在大多數其他語言中,通常需要相互遞歸的類型在同一個模塊/編譯單元中一樣,有兩個主要答案。
一種解決方案是在聲明對象類型的模塊和聲明工廠類型的模塊(兩種類型仍需要是同一類型子句的一部分)中導入的同一模塊中有兩種類型。 。例如,您可以創建一個單獨的文件,被稱爲像factory_types.nim
,並把兩種類型的變量:
type
ObjectFactory = ref object
lastValue: Object
x: proc(): Object
Object = ref object
factory: ObjectFactory
該模塊然後由雙方實施對象和實施工廠模塊的模塊導入。
另一種解決方案是可以將每個類型保留在其模塊中的參數多態,其中類型參數用作前向聲明。例如,你這樣做:
type
ObjectFactory[TargetType] = ref object
lastValue: TargetType
generator: proc(): TargetType
和其他地方:
type
Object = ref object
factory: ObjectFactory[Object]