第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

具有近似約束的函數(shù)值導(dǎo)致實例化失敗

具有近似約束的函數(shù)值導(dǎo)致實例化失敗

Go
紫衣仙女 2023-01-03 15:58:52
func GAddAll[E int, S ~[]E](e E, s S) S {   copyS := make(S, len(s))   for i, v := range s {   copyS[i] = v + e   }   return copyS}對于上面的代碼,如果我這樣實例化,運行時會報錯(cannot infer S)b := GAddAll[int]fmt.Printf("%v", b(3, []int{1, 2}))但它像這樣工作得很好fmt.Printf("%v", GAddAll[int](3, []int{1, 2}))我想知道為什么。
查看完整描述

1 回答

?
富國滬深

TA貢獻1790條經(jīng)驗 獲得超9個贊

實例化失敗,因為S ~[]E有一個近似約束,并且沒有足夠的類型信息來實例化S。

當您分配函數(shù)值時:

b := GAddAll[int]

該函數(shù)已經(jīng)被實例化。引用規(guī)范:

一個不被調(diào)用的泛型函數(shù)需要一個類型參數(shù)列表來實例化;如果列表是部分的,則所有剩余的類型參數(shù)必須是可推斷的。

然而S不可推論。編譯器唯一可用的信息是類型參數(shù)E。在第一遍替換之后,編譯器只能推斷出約束~[]E,現(xiàn)在是~[]int,但類型參數(shù)S仍然未知。

鑒于帶有波浪號 ( ~) 的近似類型集實際上是無限的,因此無法最終確定什么S是——它可能是type FooSlice []int——并且實例化失敗。

因此,如果您需要傳遞函數(shù)值,則必須通過提供兩種類型參數(shù)來實例化:

b := GAddAll[int, []int] // ok
fmt.Printf("%v", b(3, []int{1, 2}))

而是使用調(diào)用表達式:

GAddAll[int](3, []int{1, 2})

編譯器仍然不能S類型參數(shù)中推斷出來int,但它可以從非類型參數(shù)中推斷出來[]int{1,2},然后實例化函數(shù)。

被調(diào)用的泛型函數(shù)可以提供(可能是部分)類型參數(shù)列表,或者如果省略的類型參數(shù)可以從普通(非類型)函數(shù)參數(shù)中推斷出來,則可以完全省略它。

作為澄清,如果您要從 中刪除波浪號S ~[]E,如下所示:

func GAddAll[E int, S []E](e E, s S) S {}

僅提供 即可成功推理E,因為 的約束類型集的S基數(shù)為 1(精確類型)。


查看完整回答
反對 回復(fù) 2023-01-03
  • 1 回答
  • 0 關(guān)注
  • 103 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯(lián)系客服咨詢優(yōu)惠詳情

幫助反饋 APP下載

慕課網(wǎng)APP
您的移動學(xué)習(xí)伙伴

公眾號

掃描二維碼
關(guān)注慕課網(wǎng)微信公眾號