Rust - Basic - 02 - Data Type

データ型

理解

数値型 isize と usize のビット幅は、実行環境の 32/64 ビットアーキテクチャによって決まります。

デバッグモードでは整数オーバーフローで panic になりますが、リリースモードではなりません。

wrapping_* はデバッグモードでも panic しないようにできます。

checked_* はオーバーフロー時に None を返します。

overflowing_* は、オーバーフローしたかどうかを示す boolean 値を返します。

saturating_* は、オーバーフロー時に値を最小値または最大値に制限します。

tuple

let tup: (i32, f64, u8) = (500, 6.4, 1);

let tup = (500, 6.4, 1);
let (x, y, z) = tup;  // 解构赋值

let x: (i32, f64, u8) = (500, 6.4, 1);
let five_hundred = x.0;
let six_point_four = x.1;
let one = x.2;

array

let a = [1, 2, 3, 4, 5];
let a: [i32; 5] = [1, 2, 3, 4, 5];
let a = [0; 5];  // 快速初始化
let a = [[0, 5]; 20];  // 二维数组

参照元

https://doc.rust-lang.org/book/ch03-02-data-types.html

スカラー型

…

さらに、isize と usize 型は、プログラムを実行しているコンピューターの種類に依存します。64 ビットアーキテクチャなら 64 ビット、32 ビットアーキテクチャなら 32 ビットです。

…

整数オーバーフロー

0 から 255 までの値を保持できる u8 型の変数があるとします。256 のように範囲の値へ変しようとすると、整数オーバーフロー が発生します。Rust にはこの動作に関する興味深いルールがあります。デバッグモードでコンパイルすると、整数オーバーフローのチェックが含まれ、この動作が起きた場合、実行時にプログラムが panic します。Rust では、プログラムがエラーで終了することを panicking と呼びます。panic については、 9 章の 「panic! による回復不なエラー」 で詳しく説明します。

--release フラグを付けてリリースモードでコンパイルすると、Rust は panic を引き起こす整数オーバーフローのチェックを 含めません。代わりにオーバーフローが起きると、Rust は 2 の補数によるラップ を行います。つまり、型が保持できる最大値より大きい値は、その型が保持できる最小値へ「巻き戻り」ます。u8 では 256 が 0 に、257 が 1 になります。プログラムは panic しませんが、変数の値はおそらく期待したものではありません。整数オーバーフローのラップ動作に依存するのはエラーと見なされます。

オーバーフローの性を明示的に扱うには、標準ライブラリがプリミティブな数値型に提供している次のメソッド群を使えます。

  • wrapping_add などの wrapping_* メソッドは、すべてのモードでラップする
  • checked_* メソッドは、オーバーフロー時に None を返す
  • overflowing_* メソッドは、値とオーバーフローしたかどうかを示す boolean を返す
  • saturating_* メソッドは、値の最小値または最大値で飽和させる