Learn Rust Coding · レッスン

構造体のベクター

Vecに複雑なデータを保持します。

レッスン 4/413 ステップ

「構造体のベクター」はCoddyKit上の無料Learn Rust Codingレッスンです。 これはレッスン4/4です。 下記で完全なレッスンを無料で読むことができます。その後、ブラウザ内の組み込みコードエディタと24時間対応のAIチューターでハンズオン演習できます。 これはLearn Rust Coding学習パスの一部であり、ウェブとCoddyKitアプリ全体で進捗が同期されます。 Learn Rust Codingコースには全4レッスンが含まれています。

構造体のベクタを使う理由

ベクタには、独自に定義した構造体を含む、任意の単一型の値を格納できます。Vec<Person>には複数の人物を順番に格納できるため、ユーザー、商品、スコアなどのレコードのリストに適しています。

これにより、独自のデータ構造と、拡張可能なリストを組み合わせられます。

構造体を定義する

まず、格納する構造体を定義します。このPersonには名前と年齢があります。

#[derive(Debug)]の行により、{:?}を使って人物を表示できます。ベクタ全体を表示するときに便利です。

#[derive(Debug)]
struct Person {
    name: String,
    age: u32,
}

ベクタを作成する

構造体のインスタンスを作成し、それらをvec!マクロにまとめます。ベクタの型は自動的にVec<Person>になります。

{:?}を使うと、すべてのレコードを一度に表示できます。

#[derive(Debug)]
struct Person { name: String, age: u32 }

fn main() {
    let people = vec![
        Person { name: String::from("Ann"), age: 30 },
        Person { name: String::from("Bo"), age: 25 },
    ];
    println!("{:?}", people);
}

構造体を追加する

最初は空のベクタを作り、構造体を1つずつpushすることもできます。拡張するには、ベクタをmutにする必要があります。

ユーザー入力など、時間の経過とともにレコードが追加される場合に適したパターンです。

#[derive(Debug)]
struct Item { name: String }

fn main() {
    let mut cart = Vec::new();
    cart.push(Item { name: String::from("Pen") });
    cart.push(Item { name: String::from("Mug") });
    println!("{:?}", cart);
}

レコードをループ処理する

&peopleをループすると、所有権を取得せずに各構造体を読み取れます。ループ内では、p.nameのようなドット記法でフィールドにアクセスします。

これにより、すべてのレコードについて読みやすい行を表示できます。

#[derive(Debug)]
struct Person { name: String, age: u32 }

fn main() {
    let people = vec![
        Person { name: String::from("Ann"), age: 30 },
        Person { name: String::from("Bo"), age: 25 },
    ];
    for p in &people {
        println!("{} is {}", p.name, p.age);
    }
}

1つのフィールドを読み取る

ベクタのインデックスで1つの構造体にアクセスし、そのフィールドをドット記法で指定します。したがって、people[0].nameは最初の人物の名前を返します。

インデックスは0から始まり、範囲外にアクセスするとパニックになることを覚えておいてください。

#[derive(Debug)]
struct Person { name: String, age: u32 }

fn main() {
    let people = vec![
        Person { name: String::from("Ann"), age: 30 },
    ];
    println!("name: {}", people[0].name);
}

フィールドを変更する

レコードを編集するには、ベクタをmutにする必要があります。その後、構造体をインデックスで指定し、people[0].age = 31のようにフィールドへ代入します。

これにより、格納されているデータがその場で更新されます。

struct Person { name: String, age: u32 }

fn main() {
    let mut people = vec![
        Person { name: String::from("Ann"), age: 30 },
    ];
    people[0].age = 31;
    println!("{}", people[0].age);
}

フィールドの合計を求める

イテレータを使うと、すべてのレコードから1つのフィールドを取り出せます。ここではiter().map(|p| p.age).sum()で、年齢をすべて合計しています。

mapの処理で各人物を年齢だけに変換してから、合計しています。

struct Person { name: String, age: u32 }

fn main() {
    let people = vec![
        Person { name: String::from("Ann"), age: 30 },
        Person { name: String::from("Bo"), age: 20 },
    ];
    let total: u32 = people.iter().map(|p| p.age).sum();
    println!("total age = {}", total);
}

レコードを絞り込む

iter().filter(...)を使うと、条件に一致するレコードだけを残せます。クロージャは各構造体についてboolを返します。

ここでは、30歳以上の人物が何人いるかを数えています。

struct Person { name: String, age: u32 }

fn main() {
    let people = vec![
        Person { name: String::from("Ann"), age: 30 },
        Person { name: String::from("Bo"), age: 20 },
    ];
    let adults = people.iter().filter(|p| p.age >= 30).count();
    println!("adults: {}", adults);
}

フィールドでソートする

sort_by_keyを使うと、フィールドの値でレコードをソートできます。年齢など、並べ替えに使う値を返すクロージャを渡します。

ソートによってベクタの並びが変わるため、ベクタはmutでなければなりません。

#[derive(Debug)]
struct Person { name: String, age: u32 }

fn main() {
    let mut people = vec![
        Person { name: String::from("Ann"), age: 30 },
        Person { name: String::from("Bo"), age: 20 },
    ];
    people.sort_by_key(|p| p.age);
    println!("{:?}", people);
}

レコード数を数える

格納されている構造体の数は、他のベクタと同じく単純にlen()で取得できます。現在保持しているレコード数がわかります。

is_empty()と組み合わせると、最初のレコードを読み取る前に空かどうかを確認できます。

struct Item { name: String }

fn main() {
    let cart = vec![
        Item { name: String::from("Pen") },
        Item { name: String::from("Mug") },
    ];
    println!("items: {}", cart.len());
}

理解度チェック

構造体のベクタについて、理解度を確認しましょう。

まとめ

Vecに構造体を格納し、vec!とpushでベクタを作成しました。インデックスやループを使って、フィールドを読み取ったり編集したりする方法も学びました。

さらに、フィールドの合計、絞り込み、フィールドによるソート、レコード数の取得も行いました。これで、ベクタを使って構造化されたデータのリストを管理できます。

無料で開始

AI チューターと学ぶ Rust — 無料

ブラウザでリアルコードを書いて実行し、24/7 の AI チューターから瞬時にサポートを受け、ウェブまたはアプリで続きから学習できます。

コース
39
レッスン
144

よくある質問

「構造体のベクター」レッスンは無料ですか?

はい。「構造体のベクター」の完全なテキストはこのウェブで無料で読めます。インタラクティブに演習し(組み込みコードエディタと24時間対応のAIチューター)、Learn Rust Codingコースの残りをアンロックするには、CoddyKit PROにアップグレードしてください。 Learn Rust Codingコースには全4レッスンが含まれています。

「構造体のベクター」で何を学びますか?

Vecに複雑なデータを保持します。 ブラウザで直接実行するハンズオンコードでLearn Rust Codingを演習し、24時間対応のAIチューターがレッスンを進める中での質問に答えます。

Learn Rust Codingを始めるのに経験は必要ですか?

事前経験は必要ありません。CoddyKitのLearn Rust Codingは初級者から上級者向けに構成されているため、ここから始めるか最初から始めて、自分のペースで進むことができます。 これはレッスン4/4です。

「構造体のベクター」レッスンにはどのくらい時間がかかりますか?

ほとんどのCoddyKitレッスンは約5~10分かかります。各レッスンはコンパクトでインタラクティブなので、着実に進歩し、ウェブとアプリ全体で正確に前回の場所から再開できます。

このLearn Rust Codingレッスンでコードを書いて実行できますか?

はい。すべてのLearn Rust Codingレッスンに組み込みコードエディタが含まれているため、ブラウザでリアルコードを書いて実行し、即座のAIフィードバックを取得できます。ローカル設定は不要です。

このコースのすべてのレッスン

  1. ベクターを作成して値を入れる
  2. インデックス指定と反復処理
  3. 拡張と縮小
  4. 構造体のベクター
← Learn Rust Codingに戻る