プリミティブ型と演算子
Rust には、C++ とほぼ同じ算術演算子と論理演算子があります。bool は
両方の言語で同じです(true と false リテラルも同様です)。Rust には
整数、符号なし整数、浮動小数点数について同様の概念があります。ただし構文は少し異なります。Rust では isize は整数を意味し、usize は
符号なし整数を意味します。これらの型はポインターサイズです。たとえば、32 ビットシステムでは、
usize は 32 ビット符号なし整数を意味します。Rust には明示的にサイズが指定された型もあり、
u または i の後に 8、16、32、64、または 128 が続きます。したがって、たとえば、u8 は
8 ビット符号なし整数で、i32 は 32 ビット符号付き整数です。浮動小数点数については、Rust には
f32 と f64 があります。
数値リテラルには、その型を示すサフィックスを付けることができます。サフィックスが指定されていない場合、Rust は
型を推論しようとします。推論できない場合は、i32 または f64(小数点がある場合)を使用します。
例:
fn main() { let x: bool = true; let x = 34; // 型は i32 // let x = 2147483648; // エラー: リテラルが `i32` の範囲外 let x = 34isize; let x = 34usize; let x = 34u8; let x = 34i64; let x = 34f32; }
補足として、Rust では変数を再定義できるため、上記のコードは合法です -
各 let 文は新しい変数 x を作成し、以前の変数を隠します。これは、
変数がデフォルトでイミュータブルであるため、予想以上に有用です。
数値リテラルは、10 進数だけでなく、2 進数、8 進数、16 進数としても指定できます。
それぞれ 0b、0o、0x プレフィックスを使用します。数値リテラル内ではどこでも
アンダースコアを使用でき、それは無視されます。例:
fn main() { let x = 12; let x = 0b1100; let x = 0o14; let x = 0xe; let y = 0b_1100_0011_1011_0001; }
Rust には char と string がありますが、それらは Unicode であるため、 C++ とは少し異なります。ポインター、参照、ベクター(配列)を紹介した後で、 それらについて話すことにします。
Rust は数値型を暗黙的に強制変換しません。一般に、Rust は C++ よりも暗黙的な強制変換やサブタイピングがずっと少ないです。Rust は
明示的な強制変換とキャストに as キーワードを使用します。任意の数値は別の数値型にキャストできます。
as は数値型から boolean 型への変換には使用できませんが、
逆は可能です。例:
fn main() { let x = 34usize as isize; // usize を isize にキャスト let x = 10 as f32; // isize から float へ let x = 10.45f64 as i8; // float から i8 へ(精度が失われる) let x = 4u8 as u64; // 精度が増す let x = 400u16 as u8; // 144、精度が失われる(そのため値が変わる) println!("`400u16 as u8` gives {}", x); let x = -3i8 as u8; // 253、符号付きから符号なしへ(符号が変わる) println!("`-3i8 as u8` gives {}", x); //let x = 45 as bool; // 失敗します!(代わりに 45 != 0 を使用) let x = true as usize; // bool を usize にキャスト(1 になる) }
Rust には以下の演算子があります:
| 型 | 演算子 |
|---|---|
| 数値 | +, -, *, /, % |
| ビット単位 | |, &, ^, <<, >> |
| 比較 | ==, !=, >, <, >=, <= |
| 短絡論理 | ||, && |
これらはすべて C++ と同じように振る舞いますが、Rust は演算子を適用できる型について
少し厳格です - ビット単位演算子は整数にのみ適用でき、
論理演算子は boolean にのみ適用できます。Rust には数値を負にする
単項演算子 - があります。! 演算子は boolean を否定し、
整数型では各ビットを反転します(後者の場合は C++ の ~ と同等です)。Rust には C++ と同様に複合代入演算子(たとえば +=)がありますが、
インクリメント演算子やデクリメント演算子(たとえば ++)はありません。