`type` エイリアス

type キーワードを用いることで他の型へのエイリアスを宣言することができます:

fn main() { type Name = String; }
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 がそれに当たります。