コンテンツにスキップ

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です
▶ 実際に試してみよう

小数点のある数には、浮動小数点数型を使います。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、権限あり: false
▶ 実際に試してみよう

char は1つの文字を表す型で、シングルクォート ' ' で囲んで書きます。Rustの char には、Unicodeのスカラー値1つ分ならどんな文字でも入ります。日本語の「あ」や、ほとんどの絵文字も入ります。ただし、国旗の絵文字や、複数の文字を組み合わせて作られる複雑な絵文字は、1つの char には収まりません。

fn main() {
let letter = 'R';
let symbol = '$';
let crab = '🦀';
println!("{letter} {symbol} {crab}");
}

実行結果:

R $ 🦀
▶ 実際に試してみよう

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つずつで表してください。名前(&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 | ランク A
▶ 実際に試してみよう

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 です。

理解度チェック

1. 型を指定しなかった場合、Rustの整数のデフォルトの型はどれですか?

2. Rustでは、文字リテラルと文字列リテラルをどう区別しますか?

3. 伸ばしたり変更したりできる、所有権を持ったテキストの型はどれですか?

4. Rustの浮動小数点数のデフォルトの型はどれですか?

5. let greeting = "Hello"; は、どの型に推論されますか?

スコア: 0 / 5