2015-05-14 71 views
4

假設我們有兩個模塊:一個定義一個對象,另一個定義一個ObjectFactory。 Object需要訪問ObjectFactory的一些函數,並且ObjectFactory需要訪問Object才能實例化Object。在Nim中做循環依賴的有效方法

如果Object在模塊中實現並且ObjectFactory在另一個模塊中實現,那麼在Nim中解決這個問題的方法是什麼?

回答

6

我假設這裏的問題是相互遞歸的類型,即兩個或多個類型的聲明彼此引用的地方。相互引用的方法或過程通過相互遞歸導入來處理,儘管在這種情況下必須小心模塊初始化。

正如在大多數其他語言中,通常需要相互遞歸的類型在同一個模塊/編譯單元中一樣,有兩個主要答案。

一種解決方案是在聲明對象類型的模塊和聲明工廠類型的模塊(兩種類型仍需要是同一類型子句的一部分)中導入的同一模塊中有兩種類型。 。例如,您可以創建一個單獨的文件,被稱爲像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]