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

為了賬號(hào)安全,請(qǐng)及時(shí)綁定郵箱和手機(jī)立即綁定
已解決430363個(gè)問題,去搜搜看,總會(huì)有你想問的

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

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

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}對(duì)于上面的代碼,如果我這樣實(shí)例化,運(yùn)行時(shí)會(huì)報(bào)錯(cuò)(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貢獻(xiàn)1790條經(jīng)驗(yàn) 獲得超9個(gè)贊

實(shí)例化失敗,因?yàn)?code>S ~[]E有一個(gè)近似約束,并且沒有足夠的類型信息來實(shí)例化S。

當(dāng)您分配函數(shù)值時(shí):

b := GAddAll[int]

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

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

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

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

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

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

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

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

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

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

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

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

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


查看完整回答
反對(duì) 回復(fù) 2023-01-03
  • 1 回答
  • 0 關(guān)注
  • 125 瀏覽

添加回答

舉報(bào)

0/150
提交
取消
微信客服

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

幫助反饋 APP下載

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

公眾號(hào)

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