Rustは
let x = (1..10).collect(); のように型を省略して書くことが多く、ソースコード上だけでは実際の型が分かりにくい場面が多々あります。C言語のようにすべての変数の型を明示的に宣言するスタイル(
uint32_t x = 0; など)に慣れていると、ソースコード上で型が可視化されていないのは不安に感じるかもしれません。一見するとスクリプト言語のように見えますが、RustはCやC++以上に厳密な静的型付け言語です。この仕様は欠陥というよりも、「冗長な記述の削減」と「コンパイラの強力な解析」を組み合わせた型推論(Type Inference)という意図的な設計方針によるものです。
Rustのコンパイラは、前後の文脈からパズルを解くように型を確定させます。
- 冗長な記述の省略: 例えば
let mut buffer = Vec::new();と書き、数行後にbuffer.push(10_u32);とデータを追加した場合、コンパイラは「このバッファは32ビット符号なし整数の配列以外あり得ない」と逆算して確定させます。長い型名を何度も書く視覚的ノイズを減らす効果があります。 - 曖昧さの厳格な排除: もし推論の結果が複数考えられる(曖昧さが残る)場合は、コンパイラが即座にエラーを吐き、プログラマに型の明示を強制します。型がうやむやなまま実行ファイルが生成される危険性はゼロです。
つまり、機械(コンパイラ)にとっては型が完全に自明で安全性が100%担保されているのですが、人間がプレーンなテキストエディタで読む際にだけ「文脈から脳内で推論しなければならない」という負荷がかかるトレードオフが存在します。
最近のプログラミング言語は「エディタ(LSP)の支援があること」を前提に、人間のタイピング量と長すぎる型名のノイズを減らす方向に進化しています。そのため、プレーンなVimでコードを追う際に「人間にとって型が分かりにくい」と感じるのは、非常にまっとうな視点です。
なお、Rustでも型推論に頼る必要はなく、すべての変数に自分で型を明示して書くことも完全に許可されています。
コメント
コメントを投稿