Rust には豊富なプリミティブ型(基本組み込み型)が標準搭載されており、大きくスカラ型と複合型の2種類に分かれます。
(一) スカラ型(Scalar Types)
単一の独立した値を表す型で、計6種類存在します:
- 符号付き整数型:
i8、i16、i32、i64、i128、isize(サイズがシステムのポインタ幅に適応) - 符号なし整数型:
u8、u16、u32、u64、u128、usize(サイズがシステムのポインタ幅に適応) - 浮動小数点型:
f32、f64 - 文字型 char:Unicode スカラ値を格納(例:
'a'、'α'、'∞')、1文字あたり4バイトを消費 - 真偽型 bool:取り得る値は
true、falseの2種類のみ - ユニット型 ():唯一の値は空タプル
()。見た目はタプルだが単一の値しか保持しないため、複合型には分類されない。
(二) 複合型(Compound Types)(後ほど学習します)
複数の値を組み合わせて構成される型:
- 配列:例
[1, 2, 3] - タプル:例
(1, true)
1) 変数の型指定方法
すべての変数に手動で型を指定可能です。数値型には追加でサフィックスによる型指定が利用でき;指定しない場合は既定の型が使用されます:
- 整数の既定型:
i32 - 浮動小数点数の既定型:
f64
Rust はコードの文脈から自動的に型を推論する機能も備えています。
2) 変数の型
1. 明示的な型指定
変数名の後に : 型名 を記述して型を直接指定、すべての変数に対して使用できます。
fn main() {
let isOpen: bool = true;
let price: f64 = 1.0;
}Code language: JavaScript (javascript)
上記の例において、isOpen と price が変数、後ろの : 型名 が変数に対し明示的に型を宣言する記法です。
2. 数値サフィックスによる型指定
数値の末尾に型サフィックスを付けて数値の型を指定、数値に対してのみ利用可能です。
fn main() {
let an_integer = 5i32;
}Code language: JavaScript (javascript)
今回は : による変数型指定を行わず、代入する数値の後ろに i32 を付け32ビット整数型であることを指定しています。
3. 型の既定ルール
サフィックスや明示指定を一切記述しない場合、コンパイラは既定の型を適用します:
- 整数リテラル → 既定
i32 - 浮動小数点数リテラル → 既定
f64
fn main() {
let default_float = 3.0; // 自動的に f64 となる
let default_integer = 7; // 自動的に i32 となる
}Code language: JavaScript (javascript)
4. 文脈による型推論
コンパイラが後続のコードから変数の真の型を自動的に推測するため、手動で型を記述する必要がありません。
fn main() {
let mut inferred_type = 12;
inferred_type = 4294967296i64; // この行より型が i64 と推論される
}Code language: JavaScript (javascript)
可変変数 & 変数の特徴
1 可変変数
キーワード mut で修飾した変数は、値を変更可能です。
fn main() {
let mut mutable = 12;
mutable = 21; // 正当、値の変更
}Code language: JavaScript (javascript)
2 型は変更不可能
変数は一度型が確定すると実行中に一切変更できず、異なる型の値を代入すると即時コンパイルエラーとなります。
fn main() {
let mut mutable = 12;
mutable = 21; // 正当、値の変更
mutable = true; // エラー:元の型が i32 のため bool を代入不可
}Code language: JavaScript (javascript)
C:\Users\Jack\Desktop\rustdemo>rustc hello.rs
error[E0308]: mismatched types
--> hello.rs:5:12
|
3 | let mut mutable = 12;
| -- expected due to this value
4 | mutable = 21; // 正当、値の変更
5 | mutable = true; // エラー:元の型が i32 のため bool を代入不可
| ^^^^ expected integer, found `bool`
error: aborting due to 1 previous error
For more information about this error, try `rustc --explain E0308`.Code language: JavaScript (javascript)
注意点
Rust において、変数の値は既定で変更不可となっており、値を変更したい場合は mut キーワードを付加する必要があり、これは他の言語と仕様が異なります。
例えば下記コードは他言語では一般的だが、Rust ではエラーを出力します
fn main() {
let mutable:i32 = 12;
mutable = 21; // 正当、値の変更
}Code language: JavaScript (javascript)
コンパイルエラー
C:\Users\Jack\Desktop\rustdemo>rustc hello.rs
error[E0384]: cannot assign twice to immutable variable `mutable`
--> hello.rs:4:2
|
3 | let mutable:i32 = 12;
| ------- first assignment to `mutable`
4 | mutable = 21; // 正当、値の変更
| ^^^^^^^^^^^^ cannot assign twice to immutable variable
|
help: consider making this binding mutable
|
3 | let mut mutable:i32 = 12;
| +++
warning: variable `mutable` is assigned to, but never used
--> hello.rs:3:6
|
3 | let mutable:i32 = 12;
| ^^^^^^^
|
= note: consider using `_mutable` instead
= note: `#[warn(unused_variables)]` (part of `#[warn(unused)]`) on by default
warning: value assigned to `mutable` is never read
--> hello.rs:4:2
|
4 | mutable = 21; // 正当、値の変更
| ^^^^^^^^^^^^
|
= help: maybe it is overwritten before being read?
= note: `#[warn(unused_assignments)]` (part of `#[warn(unused)]`) on by default
error: aborting due to 1 previous error; 2 warnings emitted
For more information about this error, try `rustc --explain E0384`.Code language: JavaScript (javascript)
3 変数シャドーイング(Shadowing)
同一名前の変数を let で再度宣言すると、古い変数がシャドー(遮蔽)されます。二つは完全に独立した変数のため、型を変えることも可能です。
fn main() {
let mutable = 12;
let mutable = true; // 上記の i32 変数をシャドー、新しい変数の型は bool
}Code language: JavaScript (javascript)
複合型:配列 & タプル
1. 配列
- 記法:
[要素の型; 長さ]、型と長さが固定、すべての要素は同一の型でなければならない。
let my_array: [i32; 5] = [1, 2, 3, 4, 5];Code language: JavaScript (javascript)
2. タプル
()で値を囲み、複数の異なる型の値を保持可能。
let my_tuple = (5u32, 1u8, true, -5.04f32);Code language: JavaScript (javascript)