基本型

Rust には豊富なプリミティブ型(基本組み込み型)が標準搭載されており、大きくスカラ型複合型の2種類に分かれます。

(一) スカラ型(Scalar Types)

単一の独立した値を表す型で、計6種類存在します:

  • 符号付き整数型i8i16i32i64i128isize(サイズがシステムのポインタ幅に適応)
  • 符号なし整数型u8u16u32u64u128usize(サイズがシステムのポインタ幅に適応)
  • 浮動小数点型f32f64
  • 文字型 char:Unicode スカラ値を格納(例:'a''α''∞')、1文字あたり4バイトを消費
  • 真偽型 bool:取り得る値は truefalse の2種類のみ
  • ユニット型 ():唯一の値は空タプル ()。見た目はタプルだが単一の値しか保持しないため、複合型には分類されない。

(二) 複合型(Compound Types)(後ほど学習します)

複数の値を組み合わせて構成される型:

  1. 配列:例 [1, 2, 3]
  2. タプル:例 (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)

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です