数値、テキスト、true/false 値のデータ型を調べる

完了

Rust は静的型指定の言語です。 コンパイラは、プログラムをコンパイルして実行するために、コード内のすべての変数の正確なデータ型を認識している必要があります。 通常、コンパイラでは、バインドされた値に基づいて変数のデータ型を推測できます。 常にコード内で型を明示的に指定する必要はありません。 多くの型が可能な場合は、 型の注釈を使用して、コンパイラに特定の型を通知する必要があります。

次の例では、number 変数を 32 ビット整数として作成するようにコンパイラに指示しています。 変数名の後にデータ型 u32 を指定します。 変数名の後にコロン : が使用されていることに注意してください。

let number: u32 = 14;
println!("The number is {}.", number);

変数の値を二重引用符で囲むと、コンパイラは値を数値ではなくテキストとして解釈します。 値の推定データ型が変数に指定された u32 データ型と一致しないため、コンパイラによってエラーが発行されます。

let number: u32 = "14";

コンパイラ エラー:

   Compiling playground v0.0.1 (/playground)
error[E0308]: mismatched types
 --> src/main.rs:2:23
  |
2 |     let number: u32 = "14";
  |                 ---   ^^^^ expected `u32`, found `&str`
  |                 |
  |                 expected due to this

error: aborting due to previous error

この Rust Playground で、前述のコードを操作できます。

組み込みのデータ型

Rust には、数値、テキスト、真偽を表すいくつかの組み込みのプリミティブ データ型が用意されています。 これらの型のいくつかは単一の値を表すため、"スカラー" と呼ばれます。

  • 整数
  • 浮動小数点数
  • ブール値
  • 文字

Rust には、文字列やタプルの値など、データ系列を操作するためのより複雑なデータ型も用意されています。

数値: 整数と浮動小数点値

Rust の整数は、ビット サイズと符号付きプロパティによって識別できます。 符号付き整数には、正または負の数値を指定できます。 符号なし整数には、正の数値のみを指定できます。

長さ 符号付き 符号なし    
8 ビット i8 u8    
16 ビット i16 u16    
32 ビット i32 u32    
64 ビット i64 u64    
128 ビット i128 u128    
architecture-dependent isize usize    

isize 型と usize 型は、プログラムが実行されているコンピューターの種類によって異なります。 64 ビット アーキテクチャでは 64 ビット型が、32 ビットアーキテクチャでは 32 ビット型が使用されます。 整数の型を指定せず、システムが型を推論できない場合は、既定で i32 型 (32 ビット符号付き整数) が割り当てられます。

Rust には、10 進値 f32 (32 ビット) と f64 (64 ビット) の 2 つの浮動小数点データ型があります。 既定の浮動小数点型は f64 です。 最新の CPU では、f64 型は f32 型とほぼ同じ速度ですが、精度が高くなります。

let number_64 = 4.0;      // compiler infers the value to use the default type f64
let number_32: f32 = 5.0; // type f32 specified via annotation

Rust のすべてのプリミティブ数値型では、加算、減算、乗算、除算などの算術演算がサポートされています。

// Addition, Subtraction, and Multiplication
println!("1 + 2 = {} and 8 - 5 = {} and 15 * 3 = {}", 1u32 + 2, 8i32 - 5, 15 * 3);

// Integer and Floating point division
println!("9 / 2 = {} but 9.0 / 2.0 = {}", 9u32 / 2, 9.0 / 2.0);

Note

println マクロを呼び出すときに、Rust にデータ型を通知するデータ型のサフィックスを、各リテラル数値に追加します。 構文 1u32 は、値が数字の 1 であることをコンパイラに伝え、値を符号なし 32 ビット整数として解釈します。

型の注釈を提供しない場合は、Rust によってコンテキストから型が推測されます。 コンテキストがあいまいである場合は、既定で i32 型 (32 ビット符号付き整数) が割り当てられます。

この例を Rust Playground で実行してみることができます。

ブール値: True または False

Rust のブール型は、真偽を格納するために使用されます。 bool 型には、true または false の 2 つの有効な値があります。 ブール値は、条件式で広く使用されます。 bool ステートメントまたは値が true の場合は、このアクションを実行します。それ以外の場合 (ステートメントまたは値が false の場合) は、別のアクションを実行します。 ブール値は、多くの場合、比較チェックによって返されます。

次の例では、より大きい > 演算子を使用して 2 つの値をテストします。 演算子は、テストの結果を示すブール値を返します。

// Declare variable to store result of "greater than" test, Is 1 > 4? -- false
let is_bigger = 1 > 4;
println!("Is 1 > 4? {}", is_bigger);  

テキスト: 文字と文字列

Rust では、2 つの基本的な文字列型と 1 つの文字型を持つテキスト値がサポートされています。 文字は 1 つの項目で、文字列は一連の文字です。 すべてのテキスト型は有効な UTF-8 表現です。

文字

char 型は、最もプリミティブなテキスト型です。 値は、項目を単一引用符で囲んで指定します。

let uppercase_s = 'S';
let lowercase_f = 'f';
let smiley_face = '😃';

Note

一部の言語では、char 型を 8 ビット符号なし整数 (Rust の u8 型と同等) として扱います。 Rust の char 型には unicode コード ポイントが含まれていますが、UTF-8 エンコードは使用しません。 Rust の char は、32 ビット幅に埋め込まれる 21 ビットの整数です。 char には、プレーン コード ポイント値が直接含まれています。 Rust の char 型の詳細は Rust ドキュメントでわかります。

文字列

str 型は "文字列スライス" とも呼ばれ、文字列データであることがわかります。 ほとんどの場合、アンパサンドが型の前にある参照スタイルの構文 &str を使用して、これらの型を参照します。 参照については後述のモジュールで説明します。 ここでは、&str を、変更できない文字列データへのポインターと考えることができます。 文字列リテラルはすべて型 &str です。

文字列リテラルは、初歩的な Rust の例で使用するのは便利ですが、テキストを使用するすべての状況に適しているわけではありません。 コンパイル時にすべての文字列がわかっているわけではありません。 例は、実行時にユーザーがプログラムと対話し、ターミナル経由でテキストを送信する場合です。

これらのシナリオでは、Rust には String という名前の 2 番目の文字列型があります。 この型は、ヒープに割り当てられます。 String 型を使用する場合、コードをコンパイルする前に、文字列の長さ (文字数) を把握しておく必要はありません。

Note

ガベージ コレクションされた言語に慣れている場合は、Rust に 2 つの文字列型がある理由を疑問に思う可能性があります。1文字列はとても複雑なデータ型です。 ほとんどの言語では、それぞれのガベージ コレクターを使用してこの複雑さを解消しています。 システムの言語である Rust では、文字列に固有の複雑さがいくつか見られます。 この複雑さが加わることで、プログラムでのメモリの使用方法を非常に細かく制御できるようになります。

1 実際には、Rust には 2 つより多くの文字列型があります。 このモジュールでは、String 型と &str 型のみを扱います。 提供される文字列型について詳しくは、Rust のドキュメントをご覧ください。

Rust の所有権および借用システムについて学習するまで、String&str との違いについて完全に理解することはできません。 それまでは、String 型データを、プログラムの実行時に変更される可能性があるテキスト データとして考えることができます。 &str 参照は、プログラムの実行時に変更されないテキスト データの不変ビューとなります。

テキストの例

次の例は、Rust での char および &str データ型の使用方法を示しています。

  • : char 注釈構文を使用して、2 つの文字変数が宣言されます。 値は、単一引用符を使用して指定されます。
  • 3 番目の文字変数が宣言され、1 つのイメージにバインドされます。 この変数については、コンパイラにデータ型を推測させます。
  • 2 つの文字列変数が宣言され、それぞれの値にバインドされます。 文字列は二重引用符で囲まれます。
  • 文字列変数の 1 つが、データ型を指定するための : &str 注釈構文で宣言されています。 他の変数のデータ型は指定されていません。 コンパイラによって、この変数のデータ型がコンテキストに基づいて推測されます。

string_1 変数には、一連の文字の末尾に空のスペースが含まれていることに注意してください。

// Specify the data type "char"
let character_1: char = 'S';
let character_2: char = 'f';
   
// Compiler interprets a single item in quotations as the "char" data type
let smiley_face = '😃';

// Compiler interprets a series of items in quotations as a "str" data type and creates a "&str" reference
let string_1 = "miley ";

// Specify the data type "str" with the reference syntax "&str"
let string_2: &str = "ace";

println!("{} is a {}{}{}{}.", smiley_face, character_1, string_1, character_2, string_2);

この例の出力を次に示します。

😃 is a Smiley face.

この例の str の前にアンパサンド & を指定しない場合は、どうなるでしょうか。 それを調べるには、この例を Rust Playground 内で実行してみます。

自分の知識をチェックする

次の質問に答えて、学習した内容を確認してください。 質問ごとに回答を 1 つ選択して、[回答を確認] を選択します。

1.

Rust での整数値の定義方法についての説明はどれですか?

2.

Rust でのテキスト文字値のサポート方法の正しい説明はどれですか?