Rustのデータ構造は、効率的なメモリ管理と安全なデータ操作を実現するために、ユニークな設計が施されています。ここではRustでよく使われる基本的なデータ構造を取り上げ、使い方と基本操作について詳しく見ていきます。この章では以下のデータ構造を紹介します。
- ベクタ(Vec)
- 配列(Array)
- タプル(Tuple)
- 構造体(Struct)
6.1 ベクタ(Vec)
ベクタは、Rustで非常によく使われる動的なサイズのデータ構造です。他の言語におけるリストや配列のようなものですが、固定サイズの配列とは異なり、要素の追加・削除によってサイズを変更することができます。Vec
は標準ライブラリで提供されているため、std::vec::Vec
として利用可能です。
ベクタの基本的な操作
- ベクタの生成には
Vec::new()
やvec!
マクロを使います。
// 空のベクタを生成
let mut numbers: Vec<i32> = Vec::new();
// 初期値を持つベクタを生成
let mut numbers = vec![1, 2, 3, 4, 5];
要素の追加と削除
push
メソッドで要素を追加できます。pop
メソッドで最後の要素を削除し、その値を取得できます。
let mut numbers = vec![1, 2, 3];
numbers.push(4); // numbers は [1, 2, 3, 4] になる
let last = numbers.pop(); // last は Some(4) で、numbers は [1, 2, 3] になる
インデックスでのアクセスとスライシング
ベクタの要素にはインデックスを使用してアクセスできます。また、範囲指定で複数の要素をまとめて取得することも可能です。
let numbers = vec![10, 20, 30, 40];
let second = numbers[1]; // second は 20
// スライスの作成
let slice = &numbers[1..3]; // slice は &[20, 30]
イテレータ
ベクタは、iter
メソッドで簡単にイテレータを取得できるため、ループ処理に非常に便利です。
let numbers = vec![1, 2, 3, 4, 5];
for num in numbers.iter() {
println!("{}", num);
}
6.2 配列(Array)
配列は固定サイズで、メモリ内に連続して配置されるデータ構造です。Rustでは、配列のサイズはコンパイル時に固定され、要素数を変更できないため、サイズが決まっているデータを管理するのに向いています。
配列の基本的な操作
- 配列の生成には、要素の型とサイズを指定します。配列の長さを変えることはできませんが、要素の内容は可変であるため、ミュータブル変数を使うと要素の更新が可能です。
let mut numbers: [i32; 3] = [1, 2, 3];
numbers[1] = 10; // numbers は [1, 10, 3] になる
配列の初期化
同じ値で初期化する場合には以下のように書けます。
let zeros = [0; 5]; // [0, 0, 0, 0, 0] の配列を生成
配列の操作
配列もインデックスでアクセスでき、len
メソッドで要素数を取得できます。
let numbers = [1, 2, 3];
println!("Length: {}", numbers.len());
6.3 タプル(Tuple)
タプルは、異なる型の要素を一つのデータ構造にまとめることができる便利なデータ型です。Rustでは、タプルを使うことで、複数の値を一度に返すことができたり、異なる型を組み合わせて一つの構造体のように扱うことができます。
タプルの基本的な操作
- タプルは丸括弧で囲み、要素をコンマで区切って定義します。要素の数や型を変えることはできませんが、内容を変更することは可能です。
let mut person: (&str, i32) = ("Alice", 30);
person.1 = 31; // 年齢を更新
タプルの分解
タプルの要素はインデックスでアクセスすることも、パターンマッチングで分解して使うことも可能です。
let person = ("Alice", 30);
let (name, age) = person;
println!("Name: {}, Age: {}", name, age);
6.4 構造体(Struct)
**構造体(Struct)**は、Rustでカスタムデータ型を作成するためのデータ構造です。構造体は、名前とフィールドを持つため、複数の異なる型のデータを論理的にグループ化できます。
Rustでは、構造体には3つのタイプがあります:
- ユニット構造体:フィールドがない、名前だけの構造体。
- タプル構造体:フィールドがタプルとして定義された構造体。
- C言語スタイル構造体:名前付きフィールドを持つ標準的な構造体。
構造体の定義とインスタンスの生成
まず、構造体の定義方法とインスタンスの生成について解説します。
// 標準的な構造体の定義
struct Person {
name: String,
age: u32,
}
fn main() {
// インスタンスの生成
let person = Person {
name: String::from("Alice"),
age: 30,
};
println!("Name: {}, Age: {}", person.name, person.age);
}
構造体のメソッド定義
構造体には、impl
キーワードを用いてメソッドを定義することができます。これにより、構造体に特化した動作を簡単に追加できます。
impl Person {
// インスタンスメソッド
fn greet(&self) {
println!("Hello, my name is {}", self.name);
}
}
fn main() {
let person = Person {
name: String::from("Alice"),
age: 30,
};
person.greet(); // "Hello, my name is Alice" と出力される
}
初心者におすすめ!プログラミングスクールのススメ
未経験でも気軽に!サブスク型プログラミングスクール【Freeks】
プログラミングを始めたいと思っているそこのあなた、独学よりもプログラミングスクールが断然おすすめです!理由は簡単、続けやすさです。
独学の挫折率、驚きの87.5%!
独学でプログラミングを続けるのは、実はかなりハードルが高いんです。データによると、なんと87.5%もの学習者が途中で挫折しているとか。一方、各プログラミングスクールが公表しているデータによると、受講生の約95%が最後までやり抜いているとのこと。数字を見れば一目瞭然、プログラミングスクールの方が圧倒的に続けやすいんです。
有料と無料、スクールの違いは?
プログラミングスクールには有料と無料のタイプがありますが、その違いは次の通りです:
- 受講条件が異なる
- 学べるスキルやカリキュラム内容が異なる
- 就職や転職のサポート内容が異なる
どちらが自分に合っているか、よく考えて選ぶのが大事です。
サブスク型プログラミングスクール『FREEKS(フリークス)』に注目!
プログラミング初心者でも学びやすいと評判の『FREEKS』、その特徴は以下の通り:
- 未経験者向けのわかりやすいカリキュラム
- 経験豊富なエンジニアのサポート
- オンラインで自分のペースで学習可能
なんと、月会費のみで全カリキュラムが受け放題!Java、PHP、HTML/CSS、JavaScriptなど、多彩なプログラミング言語が学べるんです。しかも、AIが質問に自動で答えてくれるシステムも導入済み。
終了後は副業もサポート!
カリキュラムを終了した後には、Freeks経由で未経験者でも取り組める副業案件の受注が可能。実務を通じてスキルを磨き、市場価値の高いエンジニアへの道が開けます。
独学で悩むくらいなら、まずはプログラミングスクールをチェックしてみるのもアリかもしれませんよ!
↓ ↓ こちらをクリック ↓ ↓