Progrust Library.

// 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 i3242
大きい整数型 → 小さい整数型 上位ビットを切り捨て(1234u16 as u8210
浮動小数点型 → 整数型 小数部を0方向へ切り捨て(範囲外は飽和、NaN0。Rust 1.45以降)
整数型 → 浮動小数点型 表現可能な最も近い値に丸め
bool → 整数型 false0true1
char → 整数型 コードポイントの値('あ' as u3212354
u8char 対応するコードポイントの文字(65u8 as char'A'

補足

整数からboolやcharへの逆変換はできない

boolcharから整数型へはキャストできますが、逆方向は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で決まっており、一覧にない変換(例: 文字列と数値の相互変換)はコンパイルエラーになります。文字列との変換にはparseto_stringを使います。

Footnotes

  1. Clippy Lints — as_conversions(restrictionグループ)、cast_lossless(pedanticグループ)

  2. The Rust Reference — Type cast expressions

この辞書が使われているページ

backlinks 6

  1. 辞書数値演算
  2. 辞書変換トレイト
  3. 辞書論理値型
  4. 動かして学ぶRustプログラミング問題集 › 第2章 基本の型と演算
  5. 動かして学ぶRustプログラミング問題集 › 第4章 関数
  6. 動かして学ぶRustプログラミング問題集 › 第6章 文字列とベクタ