2016-09-20 11 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

私は失敗があまりにも明白だと思います。タイプチェッカーは実際にデフォルトを挿入するのに十分な距離には達していませんでした。なぜならこれはこれまでどおりに動作する方法がないからです。私はクロージャとジェネリックメソッドの深刻な混乱であったときにエラーメッセージのデフォルトを見たことがあります –

答えて

8

錆がないだけで、初期化からの推論を入力しますが、すべての利用状況から。したがって、型チェッカは、どの型の変数を使用するかを決めるために変数のあらゆる使用法を調べなければならず、型の推測と検査が必要になります。

これは、let() = x;が同じプロセスの一部であることを意味します。 xの使用方法であり、具体的なタイプxがどのようなものであるかを確認する必要があります。可能な型が()と一致するという事実は、コンパイラがタイプxを推測しようとしていると同時に発見されるので、デフォルトは選択されていないので、デフォルトはコンパイラがすべての用途xと何も見つかりませんでした。

関連する問題