2016-09-20 64 views
3

我玩弄一些代碼,並提出以下意見:何時將數字文字分配給默認類型?

let x = 1; 
let() = x; 

error: mismatched types [E0308] 
note: expected type `_` 
note:  found type `()` 

這顯然會失敗,但我期待錯誤地指出,預期的類型是i32,不_。我發現同樣的情況發生在未指定類型的浮動字面上,例如1.0

這是爲什麼?不應該將該類型稱爲默認類型?

更新:鐵鏽1.12,錯誤消息是更多的信息:

expected integral variable, found() 

= note: expected type `{integer}` 
= note: found type `()` 
+0

我覺得失敗太明顯了。 typechecker沒有足夠的實際插入默認值,因爲這是行不通的。我只見過錯誤消息中的默認值,當時這是一系列關閉和泛型方法 –

回答

8

鏽不只是從初始化類型推斷,但是從每次使用。因此,它的類型檢查器必須查看變​​量的每一種用法來決定它是什麼類型,並且隨着它的推進需要推斷和檢查類型。

這意味着let() = x;是同一過程的一部分。這是一個使用x,因此必須檢查,看看具體類型x可能是。在編譯器仍然試圖推導出x類型的同時發現沒有可能的類型匹配()這一事實,因此沒有選擇默認值,因爲缺省值僅在編譯器查看所有用法時使用的x,並沒有發現任何東西。

相關問題