ホームページ  >  記事  >  バックエンド開発  >  関数コンストラクターのジェネリックパラメーターの型を推論できません

関数コンストラクターのジェネリックパラメーターの型を推論できません

PHPz
PHPz転載
2024-02-09 08:00:32642ブラウズ

関数コンストラクターのジェネリックパラメーターの型を推論できません

php エディターの Youzi が、コンストラクターのジェネリック パラメーターから型を推測できない理由という、誰にとってもよくある質問に答えます。 PHP では、ジェネリック パラメーターの型推論はパラメーターのデフォルト値によって実現されます。ただし、コンストラクターでは、オブジェクトが作成される前にパラメーターが渡されるため、オブジェクトのインスタンスからパラメーターの型を推測することはできません。その結果、コンストラクターでジェネリック パラメーターの型を推論できなくなり、この問題を解決するには型を手動で指定する必要があります。

質問の内容

Go にはジェネリック コードがあり、ジェネリック パラメーターを持つ「マスター」型と、同じジェネリック パラメーターを共有する必要がある多くの「スレーブ」型があります。コードは次のようになります:

リーリー

基本的に、ユーザーは at を定義し、その後 b での t を同じにする必要があります。このタイプのコードはジェネリックスをサポートする他の言語でも動作しますが、go ではコメント行で cannot infer t コンパイル エラーが発生します (go プレイグラウンド コードはこちらを参照してください)。 a の型パラメータが int に設定されているように見えるため、 b の型パラメータも int に設定する必要があります。代わりに newb[int]() を呼び出すこともできますが、それは冗長すぎるように思えます。なぜこのようなことが起こるのでしょうか?

解決策

これは、「コンパイラは戻り値の型の使用方法に基づいて型パラメータを推論できないのはなぜですか?」のバリエーションです。回答: go 1.20 では、これは型推論の仕組みではないためです。

型推論適用対象:

  • 型パラメータリスト
  • 既知の型パラメーター (存在する場合) で初期化された置換マップ m
  • 通常の関数パラメータの (空の可能性がある) リスト (関数呼び出しの場合のみ)

これらのルールを 1 つずつ確認すると:

  • newb() 型パラメータのリストはありますか?いいえ。呼び出し時に型パラメータを指定しませんでした。

  • 他の型パラメーターを推論するために使用できる他の既知の型パラメーターはありますか?いいえ、型パラメータをまったく指定していません。このケースは、型パラメータの一部を指定する関数呼び出しに適用されることに注意してください。例:

    リーリー

    上記では、t (例: float64) のみを指定でき、コンパイラは t -> float64 を使用して置換マップを構築し、推論します。 u -> *float64

  • 最後に、通常の関数パラメータのリストはありますか?いいえ。 newb は空です。

###それだけです。コンパイラは、関数の戻り値の型がどのように使用されるかに基づいて型パラメータを推論しません。

この記事の執筆時点で、議論されている関連提案は次のとおりです:

以上が関数コンストラクターのジェネリックパラメーターの型を推論できませんの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事はstackoverflow.comで複製されています。侵害がある場合は、admin@php.cn までご連絡ください。