rs.nkmk.me

Rustのtypeで型エイリアスを定義

Posted: | Tags: Rust

Rustではtypeキーワードで型エイリアスを定義し、既存の型に別名を付けられる。

typeで型エイリアスを定義

以下のようにtypeキーワードで型エイリアスを定義できる。元の型もそのまま使える。

type Byte = u8;

let b: Byte = 100;
let u: u8 = 100;

通常の型の名前と同様に、型エイリアスの名前もアッパーキャメルケース(例: UpperCamelCase)でないとコンパイラから警告が出る。警告なのでそのままでもコンパイルは可能だが、強い理由がない限り従ったほうがよい。

type byte = u8;
// warning: type `byte` should have an upper camel case name

let b: byte = 100;

以下はリファレンスに載っている例。タプル(u8, u8)Pointという名前を付けている。実体は単なるタプルなので.0.1で要素にアクセスできる。

type Point = (u8, u8);

let p: Point = (100, 200);

assert_eq!(p.0, 100);
assert_eq!(p.1, 200);

typeの型エイリアスで出来ることと出来ないこと

型エイリアスからも関連関数を呼べる。

type MyString = String;

let s = MyString::from("abc");

{}で構造体のインスタンスを生成することも可能。

struct MyStruct {
    x: i32,
}
type MyStructAlias = MyStruct;

let my_struct = MyStructAlias { x: 100 };

タプル構造体のエイリアスの場合、()でインスタンスを生成することはできないので注意。

struct MyTupleStruct(u8);
type MyTupleStructAlias = MyTupleStruct;

// let my_tuple_struct = MyTupleStructAlias(100);
// error[E0423]: expected function, tuple struct or tuple variant, found type alias `MyTupleStructAlias`

std::io::Resultの例

typeを使っている例としてstd::io::Resultがある。

pub type Result<T> = Result<T, Error>;

上の書き方だと分かりにくいが、リファレンスでResultErrorをクリックすると実際の型に飛べる。モジュールを省略せずに書くと以下のようになる。

pub type std::io::Result<T> = std::result::Result<T, std::io::Error>;

新たな型が定義されているわけではなく、std::io::Result<T>の実体はエラー型がstd::io::Errorであるstd::result::Result<T, E>

std::io::Result<T>を使うと、いちいちstd::io::Errorを書く必要がなくなる。

関連カテゴリー