Tidak dapat membuat kesimpulan jenis dalam parameter generik pembina fungsi

PHPz
Lepaskan: 2024-02-09 08:00:32
ke hadapan
596 orang telah melayarinya

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
}
Salin selepas log masuk

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]() {}
    Salin selepas log masuk

    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!

Label berkaitan:
sumber:stackoverflow.com
Kenyataan Laman Web ini
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan
Tentang kita Penafian Sitemap
Laman web PHP Cina:Latihan PHP dalam talian kebajikan awam,Bantu pelajar PHP berkembang dengan cepat!