2015-05-14 4 views
4

Предположим, у нас есть два модуля: один определяет объект, а один определяет ObjectFactory. Объект должен иметь доступ к ObjectFactory, используя некоторые из его функций, и ObjectFactory нуждается в доступе к объекту, чтобы иметь возможность создавать объекты.Каннонический способ выполнения круговой зависимости в Nim

Что такое пушечный способ решения проблемы в Nim, если объект реализован в модуле, а ObjectFactory реализован в другом модуле?

ответ

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] 

 Смежные вопросы

  • Нет связанных вопросов^_^