キャスト

Rust には 暗黙的な 型変換はありませんが、as による明示的なキャストはサポートされています。これらは、定義されている範囲では一般に C のセマンティクスに従います。

// Copyright 2023 Google LLC
// SPDX-License-Identifier: Apache-2.0

fn main() {
    let value: i64 = 1000;
    println!("as u16: {}", value as u16);
    println!("as i16: {}", value as i16);
    println!("as u8: {}", value as u8);
}

as の結果は Rust では 常に 定義されており、プラットフォーム間で一貫しています。これは、符号を変えたり、より小さい型にキャストしたりする場合の直感に合わないことがあります。ドキュメントを確認し、明確にするためのコメントを添えてください。

as によるキャストは比較的鋭利なツールで、誤って使いやすく、将来の保守作業で使用される型や型内の値の範囲が変わると、微妙なバグの原因になり得ます。キャストは、無条件の切り捨てを意図していることを示したい場合にのみ使うのが最善です(たとえば、高位ビットに何が入っているかに関係なく、u64 の下位 32 ビットを as u32 で選択する場合)。

失敗しないキャスト(たとえば u32 から u64)では、そのキャストが実際に失敗しないことを明確にするため、as よりも FromInto を使うことを優先してください。失敗する可能性のあるキャストでは、収まるものと収まらないものを分けて扱いたい場合に TryFromTryInto を利用できます。

このスライドの後で休憩を取ることを検討してください。

as は C++ の static cast に似ています。データが失われる可能性がある場合の as の使用は、一般に推奨されません。少なくとも説明コメントを付けるべきです。

これは、インデックスとして使うために整数を usize にキャストする場合によく見られます。