Я предполагаю, что проблема здесь связана с взаимно рекурсивными типами, то есть где объявления двух или более типов относятся друг к другу. Способы или процедуры, которые относятся друг к другу, обрабатываются с помощью взаимно рекурсивного импорта, хотя в этом случае нужно быть осторожным с инициализацией модуля.
Как и в большинстве других языков, которые обычно требуют взаимно-рекурсивных типов, чтобы быть в пределах одного модуля/модуля компиляции, есть два основных ответа.
Одним из решений является наличие двух типов в одном модуле, которые импортируются как модулем, объявляющим тип объекта, так и модуль, который объявляет заводский тип (оба типа по-прежнему должны быть частью одного и того же типа) , Например, создать отдельный файл, названный что-то вроде 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]