4

2 つのモジュールがあるとします。1 つは Object を定義し、もう 1 つは ObjectFactory を定義します。オブジェクトは、ObjectFactory にアクセスしてその関数の一部を使用する必要があり、ObjectFactory は、オブジェクトをインスタンス化できるようにオブジェクトにアクセスする必要があります。

オブジェクトがモジュールに実装され、ObjectFactory が別のモジュールに実装されている場合、Nim でこれを解決する標準的な方法は何ですか?

4

1 に答える 1

7

ここでの問題は、相互に再帰的な型、つまり、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]
于 2015-05-14T10:56:55.143 に答える