2 つのモジュールがあるとします。1 つは Object を定義し、もう 1 つは ObjectFactory を定義します。オブジェクトは、ObjectFactory にアクセスしてその関数の一部を使用する必要があり、ObjectFactory は、オブジェクトをインスタンス化できるようにオブジェクトにアクセスする必要があります。
オブジェクトがモジュールに実装され、ObjectFactory が別のモジュールに実装されている場合、Nim でこれを解決する標準的な方法は何ですか?
2 つのモジュールがあるとします。1 つは Object を定義し、もう 1 つは ObjectFactory を定義します。オブジェクトは、ObjectFactory にアクセスしてその関数の一部を使用する必要があり、ObjectFactory は、オブジェクトをインスタンス化できるようにオブジェクトにアクセスする必要があります。
オブジェクトがモジュールに実装され、ObjectFactory が別のモジュールに実装されている場合、Nim でこれを解決する標準的な方法は何ですか?
ここでの問題は、相互に再帰的な型、つまり、2 つ以上の型の宣言が相互に参照する場合にあると想定しています。相互に参照するメソッドまたはプロシージャは、相互に再帰的なインポートによって正常に処理されますが、この場合のモジュールの初期化には注意が必要です。
通常、相互に再帰的な型を同じモジュール/コンパイル ユニット内に配置する必要がある他のほとんどの言語と同様に、主な答えは 2 つあります。
1 つの解決策は、オブジェクト型を宣言するモジュールとファクトリ型を宣言するモジュールの両方によってインポートされる同じモジュール内に 2 つの型を含めることです (両方の型が同じ型句の一部である必要があります)。たとえば、 のような名前の別のファイルを作成し、factory_types.nim
その中に両方のタイプを入れます。
type
ObjectFactory = ref object
lastValue: Object
x: proc(): Object
Object = ref object
factory: ObjectFactory
このモジュールは、オブジェクトを実装するモジュールとファクトリを実装するモジュールの両方によってインポートされます。
モジュール内に各型を保持できるもう 1 つの解決策は、型パラメーターが前方宣言として使用されるパラメトリック ポリモーフィズムです。たとえば、次のようにします。
type
ObjectFactory[TargetType] = ref object
lastValue: TargetType
generator: proc(): TargetType
および他の場所:
type
Object = ref object
factory: ObjectFactory[Object]