注意: 最新版のドキュメントをご覧ください。この第1版ドキュメントは古くなっており、最新情報が反映されていません。リンク先のドキュメントが現在の Rust の最新のドキュメントです。
type
キーワードを用いることで他の型へのエイリアスを宣言することができます:
type Name = String;
このようにすると 定義した型を実際の型であるかのように利用することができます:
fn main() { type Name = String; let x: Name = "Hello".to_string(); }type Name = String; let x: Name = "Hello".to_string();
しかしながら、これはあくまで エイリアス であって、新しい型ではありません。 言い換えると、Rustは強い型付け言語であるため、異なる型同士の比較が失敗することを期待するでしょう。 例えば:
fn main() { let x: i32 = 5; let y: i64 = 5; if x == y { // ... } }let x: i32 = 5; let y: i64 = 5; if x == y { // ... }
このようなコードは以下のエラーを発生させます:
error: mismatched types:
expected `i32`,
found `i64`
(expected i32,
found i64) [E0308]
if x == y {
^
一方で、エイリアス用いた場合は:
fn main() { type Num = i32; let x: i32 = 5; let y: Num = 5; if x == y { // ... } }type Num = i32; let x: i32 = 5; let y: Num = 5; if x == y { // ... }
このコードはエラーを起こすこと無くコンパイルを通ります。 Num
型の値は i32
型の値とすべての面において等価です。
本当に新しい型がほしい時は タプル構造体 を使うことができます。
また、エイリアスをジェネリクスと共に利用する事もできます:
fn main() { use std::result; enum ConcreteError { Foo, Bar, } type Result<T> = result::Result<T, ConcreteError>; }use std::result; enum ConcreteError { Foo, Bar, } type Result<T> = result::Result<T, ConcreteError>;
このようにすると Result
型の Result<T, E>
の E
として常に ConcreteError
を持っている特殊化されたバージョンが定義されます。
このような方法は標準ライブラリで細かく分類されたエラーを定義するために頻繁に使われています。
一例を上げると io::Result がそれに当たります。