// dictionary
キャスト.
Rustではas演算子を使用することで別の型へキャストすることができます。
論理値型や文字型から整数型への変換など、特定のプリミティブ型の決まった組み合わせだけが許可されています。
ただしasによるキャストは、収まらない値が黙って変わる変換のため多用は好まれず、変換トレイトで書ける変換はそちらが推奨されます。
fn main() {
let total: i32 = 253; // 3科目の合計点
let subjects: i32 = 3;
let average = total as f64 / subjects as f64; // f64に揃えてから除算
println!("平均点: {:.1}", average);
}Playgroundで開くasによるキャストの挙動
asによるキャストは失敗せずパニックも起きません。その代わり、値が変換先の型に収まらない場合は次の規則で黙って値が変化します。
| 変換 | 挙動 |
|---|---|
| 小さい整数型 → 大きい整数型 | 値はそのまま(42u8 as i32 は 42) |
| 大きい整数型 → 小さい整数型 | 上位ビットを切り捨て(1234u16 as u8 は 210) |
| 浮動小数点型 → 整数型 | 小数部を0方向へ切り捨て(範囲外は飽和、NaNは0。Rust 1.45以降) |
| 整数型 → 浮動小数点型 | 表現可能な最も近い値に丸め |
bool → 整数型 |
falseは0、trueは1 |
char → 整数型 |
コードポイントの値('あ' as u32 は 12354) |
u8 → char |
対応するコードポイントの文字(65u8 as char は 'A') |
補足
整数からboolやcharへの逆変換はできない
boolやcharから整数型へはキャストできますが、逆方向はu8 as charを除いてコンパイルエラーになります。
fn main() {
let flag = 1i32 as bool; // エラー: E0054(整数からboolへはキャスト不可)
println!("{}", flag);
}Playgroundで開く数値からboolへはn != 0のような比較で、u32からcharへはchar::from_u32(不正なコードポイントをNoneで返す)で変換します。
そのほかにキャストできるもの
- フィールドを持たないenumから整数型への変換(バリアントの判別値が得られます。
Dropを実装するenumは不可) - 生ポインタ・
usize・関数ポインタの間の相互変換(キャスト自体はsafeですが、得たポインタの参照外しにunsafeが必要な低レイヤ操作向け)
asで許可される組み合わせはThe Rust Referenceの一覧2で決まっており、一覧にない変換(例: 文字列と数値の相互変換)はコンパイルエラーになります。文字列との変換にはparseやto_stringを使います。
Footnotes
-
Clippy Lints — as_conversions(restrictionグループ)、cast_lossless(pedanticグループ) ↩
この辞書が使われているページ
backlinks 6