php小編魚仔在這篇文章中將介紹如何使用指向型別參數的指標來建立泛型類型的實例。泛型是一種在程式設計中廣泛應用的概念,它允許我們在不指定具體類型的情況下編寫通用的程式碼。在php中,雖然沒有原生支援泛型的功能,但我們可以透過使用指向類型參數的指標來模擬實作泛型。這種方法可以讓我們在編寫程式碼時更加靈活和高效,提高程式碼的複用性和可維護性。在接下來的內容中,我們將詳細介紹如何使用這種方法來建立泛型類型的實例,並給出一些實際應用的範例。
給定這些類型定義:
type n interface{ ~int | ~float32 | ~float64 } type s[t any] struct { t t } type myint int type pspmyint[t myint] *s[*t] type spmyint[t *myint,] s[t] type spmyint2[t myint] s[*t]
我可以建立 type pspmyint
的 var
func createps[t myint]() pspmyint[t] { var i t s := s[*t]{t: &i} return &s }
但我不知道如何建立 spmyint
或 spmyint2
的變數。
這個
func createSP[T myInt]() spMyInt2[T] { var i T s := S[*T]{t: &i} return s }
編譯失敗
不能在return語句中使用s(s[*t]類型的變數)作為spmyint2[t]型別。
首先,不要使用精確型別參數限制。這幾乎沒有任何意義。當您將函數宣告為createps[t myint]()
時,類型參數類型集的基底數為1,因此可以有效地由myint
實例化僅和永遠。您可以像下面這樣重寫該函數:
解決這個問題:
類型 s[*t]
與 spmyint2[t]
不同。但是,由於 spmyint2[t]
的底層類型是 s[*t]
,因此您可以簡單地轉換:
至於 type spmyint[t *myint,] s[t]
(其中逗號不是拼字錯誤,但需要避免解析歧義),事情並不那麼簡單。
問題在於型別參數不是其型別約束。因此,類型文字不能用於實例化不同的未命名類型文字。需要明確的是:
// naive attempt that doesn't compile func createsp1[t myint]() spmyint[*t] { var i t s := s[*t]{t: &i} return spmyint[*t](s) }
您可能認為spmyint[t *myint]
有一個類型參數約束為*myint
且函數t
受基本型別myint
約束,因此 *t
應該滿足phpcnc phpcnt * myint。這是不正確的,因為類型文字 *t
不等於 *myint
的明顯不明顯的原因。所以實際上你不能為 type spmyint[t *myint,] s[t]
寫一個通用建構子。
但是你很幸運,因為類型限制的基數為一。所以你可以刪除類型參數:
func createSP1() spMyInt[*myInt] { var i myInt s := S[*myInt]{t: &i} return spMyInt[*myInt](s) }
以上是使用指向類型參數的指標建立泛型類型的實例的詳細內容。更多資訊請關注PHP中文網其他相關文章!