Rustのtypeで型エイリアスを定義
Posted:
| Tags:
Rust
Rustではtype
キーワードで型エイリアスを定義し、既存の型に別名を付けられる。
typeで型エイリアスを定義
以下のようにtype
キーワードで型エイリアスを定義できる。元の型もそのまま使える。
type Byte = u8;
let b: Byte = 100;
let u: u8 = 100;
source: type_alias.rs
通常の型の名前と同様に、型エイリアスの名前もアッパーキャメルケース(例: UpperCamelCase
)でないとコンパイラから警告が出る。警告なのでそのままでもコンパイルは可能だが、強い理由がない限り従ったほうがよい。
type byte = u8;
// warning: type `byte` should have an upper camel case name
let b: byte = 100;
source: type_alias.rs
以下はリファレンスに載っている例。タプル(u8, u8)
にPoint
という名前を付けている。実体は単なるタプルなので.0
や.1
で要素にアクセスできる。
type Point = (u8, u8);
let p: Point = (100, 200);
assert_eq!(p.0, 100);
assert_eq!(p.1, 200);
source: type_alias.rs
typeの型エイリアスで出来ることと出来ないこと
型エイリアスからも関連関数を呼べる。
type MyString = String;
let s = MyString::from("abc");
source: type_alias.rs
{}
で構造体のインスタンスを生成することも可能。
struct MyStruct {
x: i32,
}
type MyStructAlias = MyStruct;
let my_struct = MyStructAlias { x: 100 };
source: type_alias.rs
タプル構造体のエイリアスの場合、()
でインスタンスを生成することはできないので注意。
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`
source: type_alias.rs
std::io::Resultの例
type
を使っている例としてstd::io::Result
がある。
pub type Result<T> = Result<T, Error>;
上の書き方だと分かりにくいが、リファレンスでResult
やError
をクリックすると実際の型に飛べる。モジュールを省略せずに書くと以下のようになる。
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
を書く必要がなくなる。