在Nim中使用循环依赖的方法

Vla*_*ing 4 nim-lang

假设我们有两个模块:一个定义一个Object,另一个定义一个ObjectFactory.Object需要访问ObjectFactory才能使用它的一些函数,而ObjectFactory需要访问Object才能实例化Object.

如果Object在模块中实现并且ObjectFactory在另一个模块中实现,那么在Nim中解决这个问题的方法是什么?

Rei*_*nds 6

我假设这里的问题是相互递归的类型,即两个或更多类型的声明相互引用的地方.通过相互递归导入可以很好地处理彼此引用的方法或过程,但在这种情况下必须小心模块初始化.

与通常需要相互递归类型的大多数其他语言在同一模块/编译单元中一样,有两个主要答案.

一种解决方案是将两种类型放在同一模块中,该模块由声明对象类型的模块和声明工厂类型的模块导入(两种类型仍然需要是同一类型子句的一部分).例如,您创建一个单独的文件,称为类似的文件,factory_types.nim并将两种类型放在其中:

type
  ObjectFactory = ref object
    lastValue: Object
    x: proc(): Object

  Object = ref object
    factory: ObjectFactory
Run Code Online (Sandbox Code Playgroud)

然后,该模块将由实现该对象的模块和实现该工厂的模块导入.

另一种解决方案是参数多态,其中可以将每种类型保留在其模块中,其中类型参数用作前向声明.例如,你这样做:

type
  ObjectFactory[TargetType] = ref object
    lastValue: TargetType
    generator: proc(): TargetType
Run Code Online (Sandbox Code Playgroud)

和其他地方:

type
  Object = ref object
    factory: ObjectFactory[Object]
Run Code Online (Sandbox Code Playgroud)