Rumah  >  Artikel  >  pembangunan bahagian belakang  >  Tidak dapat membuat kesimpulan jenis dalam parameter generik pembina fungsi

Tidak dapat membuat kesimpulan jenis dalam parameter generik pembina fungsi

PHPz
PHPzke hadapan
2024-02-09 08:00:32581semak imbas

Tidak dapat membuat kesimpulan jenis dalam parameter generik pembina fungsi

editor php Youzi akan menjawab soalan biasa untuk semua orang: sebab jenis itu tidak boleh disimpulkan daripada parameter generik pembina. Dalam PHP, jenis inferens untuk parameter generik dicapai melalui nilai lalai parameter. Walau bagaimanapun, dalam pembina, memandangkan parameter diluluskan sebelum objek dicipta, jenis parameter tidak boleh disimpulkan daripada contoh objek. Ini mengakibatkan ketidakupayaan untuk membuat kesimpulan jenis parameter generik dalam pembina, dan jenisnya perlu ditentukan secara manual untuk menyelesaikan masalah ini.

Kandungan soalan

Saya mempunyai beberapa kod generik di mana saya mempunyai jenis "tuan" dengan parameter generik dan banyak jenis "hamba" yang sepatutnya berkongsi parameter generik yang sama. Kod kelihatan serupa dengan ini:

type Doer[T any] interface {
    ModifyA(*A[T])
}

type B[T any] struct {
}

func NewB[T any]() *B[T] {
    return new(B[T])
}

func (b *B[T]) ModifyA(a *A[T]) {
    // Do a thing
}

type A[T any] struct{}

func NewA[T any]() A[T] {
    return A[T]{}
}

func (a *A[T]) Run(doers ...Doer[T]) {
    for _, doer := range doers {
        doer.ModifyA(a)
    }
}

func main() {
    a := new(A[int])
    a.Run(NewB())   // error here
}

Pada asasnya, pengguna sepatutnya berada dalam a 上定义 t ,然后 b 上的 t 应该是相同的。此类代码可以在支持泛型的其他语言中工作,但在 go 中,我在注释行处收到 cannot infer t 编译错误(请参阅此处的 go playground 代码)。在我看来, a 上的类型参数设置为 int ,因此 b 上的类型参数也应设置为 int 。我可以改为调用 newb[int]() , tetapi ini nampaknya terlalu bertele-tele bagi saya. Mengapa ini berlaku?

Penyelesaian

Ini ialah variasi pada "Mengapa pengkompil tidak boleh membuat kesimpulan parameter jenis berdasarkan cara jenis pulangan digunakan?" Jawapan: Kerana mulai 1.20, ini bukan cara inferens jenis berfungsi.

Taip inferensTerpakai kepada:

  • Taip senarai parameter
  • Peta penggantian m dimulakan dengan parameter jenis yang diketahui (jika ada)
  • Senarai (mungkin kosong) bagi argumen fungsi biasa (hanya dalam kes panggilan fungsi)

Jika anda menyemak peraturan ini satu persatu:

  • newb() Adakah terdapat senarai parameter jenis? Tidak. Anda memanggilnya tanpa menyatakan parameter jenis.

  • Adakah terdapat parameter jenis lain yang diketahui yang boleh digunakan untuk membuat kesimpulan parameter jenis lain? Tidak, anda tidak memberikan sebarang parameter jenis sama sekali. Ambil perhatian bahawa kes ini digunakan untuk panggilan fungsi yang anda memberikan separa parameter jenis, contohnya:

    func foo[T any, U *T]() {}

    Di atas anda hanya boleh menyediakan t,例如float64,编译器将使用 t -> float64 构造替换映射,然后推断 u -> *float64

  • Akhir sekali, adakah terdapat senarai parameter fungsi normal? tidak. newb kosong.

Itu sahaja. Pengkompil tidak membuat kesimpulan parameter jenis berdasarkan cara jenis pulangan fungsi digunakan.

Pada masa penulisan, cadangan berkaitan yang sedang dibincangkan ialah:

Atas ialah kandungan terperinci Tidak dapat membuat kesimpulan jenis dalam parameter generik pembina fungsi. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan:
Artikel ini dikembalikan pada:stackoverflow.com. Jika ada pelanggaran, sila hubungi admin@php.cn Padam