Rustのデータ型
Rustの値には、すべて型があります。型とは、それがどんな種類のデータなのか(整数、小数、テキスト、true/false など)をコンパイラに伝えるラベルのようなものです。型がわかっているからこそ、Rustはプログラムを実行する前にコードの間違いをチェックできます。
変数のページで見たように、Rustはたいてい型を推論してくれます。それでも、主な型の名前は知っておくと役に立ちます。エラーメッセージや関数のシグネチャ(引数や戻り値の型の宣言)でよく目にするからです。
整数とは、42 や -7 のような小数点のない数です。Rustには、サイズと負の数を扱えるかどうかによって、いくつかの整数型があります。
| 型 | 符号付き? | よくある使い道 |
|---|---|---|
i32 |
はい(負の数もOK) | デフォルト。特別な理由がなければこれを使う |
u32 |
いいえ(0以上) | 個数、サイズなど、負にならないもの |
i64 / u64 |
はい / いいえ | とても大きな数 |
usize |
いいえ | コレクションのインデックス(添字) |
fn main() { let temperature = -5; // デフォルトで i32 let count: u32 = 100; // 明示的に符号なしにする println!("気温は{temperature}度、個数は{count}です");}実行結果:
気温は-5度、個数は100です浮動小数点数(小数)
Section titled “浮動小数点数(小数)”小数点のある数には、浮動小数点数型を使います。f64(デフォルト、倍精度)と f32 の2種類があります。
fn main() { let pi = 3.14159; // デフォルトで f64 let price: f32 = 9.99; println!("円周率は{pi}、価格は{price}です");}実行結果:
円周率は3.14159、価格は9.99です小さい f32 がどうしても必要な場合以外は、f64 を使いましょう。f64 のほうが精度が高く、最近のハードウェアでは速さも変わりません。
真偽値(boolean、bool)は、いちばんシンプルな型です。値は true か false のどちらかだけです。if 文や条件式で、いつも使うことになります。
fn main() { let is_logged_in = true; let has_permission: bool = false; println!("ログイン中: {is_logged_in}、権限あり: {has_permission}");}実行結果:
ログイン中: true、権限あり: falsechar は1つの文字を表す型で、シングルクォート ' ' で囲んで書きます。Rustの char には、Unicodeのスカラー値1つ分ならどんな文字でも入ります。日本語の「あ」や、ほとんどの絵文字も入ります。ただし、国旗の絵文字や、複数の文字を組み合わせて作られる複雑な絵文字は、1つの char には収まりません。
fn main() { let letter = 'R'; let symbol = '$'; let crab = '🦀'; println!("{letter} {symbol} {crab}");}実行結果:
R $ 🦀文字列(テキスト)
Section titled “文字列(テキスト)”Rustでは、テキストはダブルクォートで囲んで書きます。よく出てくる文字列の型は2つあります。
&str— 文字列スライスです。たいていはコードの中に直接書いたテキスト(「文字列リテラル」)です。String— 伸ばしたり変更したりできる、所有権を持ったテキストです。
fn main() { let greeting = "こんにちは"; // &str let mut name = String::from("Ferris"); // String name.push_str("くん"); // String は伸ばせる println!("{greeting}、{name}!");}実行結果:
こんにちは、Ferrisくん!&str と String の違いは、まだ気にしなくて大丈夫です。これは、もうすぐ学ぶ所有権とつながっています。今のところは、テキストには "..." を使い、組み立てたり変更したりしたいときは String を使う、と覚えておきましょう。
ほとんどの場合、Rustは型を推論してくれます。でも、ときにはヒントが必要なこともあります。たとえば、テキストを数値に変換(パース)するときです(これは型変換のページで出てきます)。型はコロンを使って書きます。
let x: i32 = 42;let y: f64 = 3.5;let active: bool = true;| 型 | 中身 | 例 |
|---|---|---|
i32 |
整数(デフォルト) | let n = 42; |
u32 |
0以上の整数 | let n: u32 = 42; |
f64 |
小数(デフォルト) | let pi = 3.14; |
bool |
true または false |
let ok = true; |
char |
1つの文字 | let c = 'A'; |
&str |
文字列リテラル | let s = "hi"; |
String |
伸ばせるテキスト | let s = String::from("hi"); |
1. プレイヤーのプロフィール
Section titled “1. プレイヤーのプロフィール”ゲームのキャラクターを、それぞれの型の変数1つずつで表してください。名前(&str)、レベル(i32)、体力のパーセント(f64)、is_online フラグ(bool)、ランクを表す1文字(char)です。すべてを1行で表示しましょう。ヒント:char はシングルクォート、テキストはダブルクォートを使います。
解答を見る
fn main() { let name = "Ferris"; // &str let level = 7; // i32 let health = 82.5; // f64 let is_online = true; // bool let rank = 'A'; // char
println!("{name} | レベル {level} | 体力 {health}% | オンライン: {is_online} | ランク {rank}");}実行結果:
Ferris | レベル 7 | 体力 82.5% | オンライン: true | ランク A2. 文を組み立てる
Section titled “2. 文を組み立てる”String::from("Rust") から始めて、"は速くて" と "安全です" を付け足し、結果を表示してください。ヒント:push_str で変更できるようにするには、String を mut で宣言しておく必要があります。
解答を見る
fn main() { let mut sentence = String::from("Rust"); sentence.push_str("は速くて"); sentence.push_str("安全です"); println!("{sentence}");}実行結果:
Rustは速くて安全です- 値にはすべて型があり、たいていはRustが推論してくれます。
- 整数なら
i32(デフォルト)、小数ならf64(デフォルト)です。 boolはtrueかfalse、charはシングルクォートで囲んだ1文字です。- テキストはダブルクォートで書きます。リテラルは
&str、伸ばせるテキストはStringです。
理解度チェック
Section titled “理解度チェック”理解度チェック
1. 型を指定しなかった場合、Rustの整数のデフォルトの型はどれですか?
2. Rustでは、文字リテラルと文字列リテラルをどう区別しますか?
3. 伸ばしたり変更したりできる、所有権を持ったテキストの型はどれですか?
4. Rustの浮動小数点数のデフォルトの型はどれですか?
5. let greeting = "Hello"; は、どの型に推論されますか?
スコア: 0 / 5
さらに詳しく
Section titled “さらに詳しく”- データ型 — The Rust Programming Language 日本語版:すべてのスカラー型のサイズと範囲、整数のオーバーフロー、そして複合型(タプルと配列)を説明しています。
- 基本データ型 — Rust by Example 日本語版:基本的な型それぞれの実行できる例です。続きとして、
1_000や0x80のようなリテラルの解説もあります。 i32— 標準ライブラリのドキュメント(英語):最小値と最大値(i32::MIN、i32::MAX)や、数値が持つたくさんのメソッドがわかります。char— 標準ライブラリのドキュメント(英語):Unicodeのスカラー値とは何か、そしてなぜcharは常に4バイトなのかを説明しています。String— 標準ライブラリのドキュメント(英語):Stringと&strの関係や、テキストを組み立てたり変更したりするすべてのメソッドが載っています。