Rustのプリミティブ型
Essential前提知識
Rustのすべての値は型を持つ。最も単純な型は言語に組み込まれている。これらの**プリミティブ型(primitive types)**は、他のすべての型を構成するための原子だ。
整数型
Rustには5つの幅の符号付き・符号なし整数型と、ポインタ幅のペアがある:
| 符号付き | 符号なし | 幅 |
|---|---|---|
i8 | u8 | 8ビット |
i16 | u16 | 16ビット |
i32 | u32 | 32ビット |
i64 | u64 | 64ビット |
i128 | u128 | 128ビット |
isize | usize | ポインタ幅(64ビットシステムでは64ビット) |
符号付き型は2の補数を使う。u8 は 、i8 は の範囲を持つ。
usize は配列のインデックスやメモリ長の型だ — メモリアドレッシングに自然な整数サイズだ。Zigから来たなら対応は直接的だ:ZigのZigの u8、i32、usize、isize はそのまま対応する。
let a: u8 = 255;
let b: i32 = -1_000_000; // アンダースコアは区切り文字として使える
let c: usize = 42;
整数オーバーフロー:デバッグビルドではRustは整数オーバーフローでパニックし、リリースビルドではラップアラウンドする。明示的なラップアラウンドセマンティクスには .wrapping_add()、.wrapping_mul() などのメソッドを使う。
浮動小数点型
RustはIEEE 754浮動小数点型を2つ提供する:
f32— 32ビット単精度f64— 64ビット倍精度(浮動小数点リテラルのデフォルト)
let x: f32 = 1.5;
let y = 2.71828; // f64 と推論される
f32 と f64 の間の演算は暗黙的でない — as でキャストする必要がある。
真偽値型
bool はちょうど2つの値を持つ:true と false。メモリ上では1バイトだ。
let flag = true;
let combined = flag && false; // false
Rustは整数を真偽値として扱わない。if 1 { } はコンパイルエラーだ;bool 式を渡す必要がある。
文字型
char はUnicodeスカラー値(scalar value)だ — 単一のUnicodeコードポイントで、4バイトで格納される。
let letter = 'a';
let crab = '🦀';
char リテラルはシングルクォートを使い、文字列リテラルはダブルクォートを使う。Rustの char はバイトではない:文字列を .chars() でイテレートするとコードポイントが得られ、.bytes() では生のバイトが得られる。
ユニット型
() は**ユニット型(unit type)**だ — 他の言語でいう「void」にあたる。ちょうど1つの値を持ち、それも () と書く。戻り値の型を指定しない関数は暗黙的に () を返す。
fn greet(name: &str) { // 戻り値の型は ()
println!("Hello, {name}!");
}
ユニット型はジェネリクスで自然に現れる:Result<(), String> は有用な値なしで成功し、String で失敗する結果だ。
数値リテラル
let decimal = 98_222; // 読みやすさのためのアンダースコア
let hex = 0xff;
let octal = 0o77;
let binary = 0b1111_0000;
let byte: u8 = b'A'; // バイトリテラル — u8 のみ
as によるキャスト
as キーワードは明示的な数値変換を行う:
let wide: i32 = 300;
let narrow = wide as u8; // 切り捨て:300 % 256 = 44
数値型間の変換はRustでは常に明示的だ。暗黙的な拡大や縮小はない。狭い型にキャストするときの切り捨てや符号の変化に注意すること。