🦀

100日後にRustをちょっと知ってる人になる: [Day 80]書籍: Rust プログラミング完全ガイド その4

2022/12/07に公開

Day 80 のテーマ

Day 79 までに Rust の書籍の Rustプログラミング完全ガイド の 1 章から 7 章までを読み終わりました。

今週中にこの書籍を読み終えようとおもっているのですが、今日はどこまで読み進められるでしょうか。というわけで、読んでいきたいと思います。

第8章 混成的なデータ構造を使う

この章での内容:

  • タプル
  • 構造体
  • タプル構造体

タプルについてのメモ

タプルの定義の仕方は配列と似ています。

let array = ["first", "second", "third"];

println!("{}, {}, {}", array[0], array[1], array[2]);
let tuple = ("first", 2, 3.00);

println!("{}, {}, {}", tuple.0, tuple.1, tuple.2);

**配列は角括弧[]**で、タプルは丸括弧() という違いがあります。

構造体についてメモ

タプルも構造体も、複数の異なる型のオブジェクトを含んだ構造を定義するためのものです。

  • タプル
    • 型に名前がない
    • 事前に宣言しない
    • フィールドに名前がない
  • 構造体
    • 型に名前がある
    • 事前に宣言しておく
    • フィールドに名前がある
struct SomeData {
    integer: i32,
    fractional: f32,
    character: char,
}

let data = SomeData {
    integer: 12,
    fractional: 34.56,
    character: 'a',
};

println!("{}, {}, {}", data.integer, data.fractional, data.character);

ポイントは波括弧とセミコロンがないところ。

タプル構造体についてメモ

タプルと構造体の中間のような構造

  • タプル構造体
    • 型に名前がある
    • 事前に宣言しておく
    • フィールドに名前がない
struct SomeData (
    i32,
    f32,
    char,
);

let data = SomeData(
    12,
    34.56,
    'a',
);

println!("{}, {}, {}", data.0, data.1, data.2);

ポイントは丸括弧とセミコロンがあるところ。

第9章 関数を定義する

この章での内容:

  • 自作の関数を定義して呼び出す方法
  • 同じ名前の関数は、いつ、どうすれば複数持てるのか
  • 関数に引数を渡す方法(値渡しと参照渡し)
  • 関数から単純な値や複合的な値を返す方法
  • 関数を早期に終える方法
  • オブジェクトへの参照、どう操作できるのか

値渡しと参照渡しについてメモ

Rust の関数を呼び出してパラメータ設定を行う時に特に何も気に留めなければ、値渡しになります。
値渡しの場合は、オブジェクトのコピーを渡しているので、元のデータへの変更は発生しません。

fn double(mut arr: [i32; 5]) {
    for i in 0..5 {
        arr[i] *= 2;
        println!("{}: {}", i, arr[i]);
    }
}

let mut arr = [1, 2, 3, 4, 5];

double(arr);
println!("{:?}", arr);

オブジェクトのコピーではなくて、データのアドレスを関数に引数として渡して、関数内の処理を元のデータに対しても影響させるのが参照渡しです。

fn double(arr: &mut [i32; 5]) {
    for i in 0..5 {
        (*arr)[i] *= 2;
        println!("{}: {}", i, arr[i]);
    }
}

let mut arr = [1, 2, 3, 4, 5];

double(&mut arr);
println!("{:?}", arr);

型指定の前に & を付けることで、その型を持つオブジェクトのアドレスを指定するという操作になります。一方で、関数の中ではアドレスを操作するのではなくて、アドレスが参照しているオブジェクトを操作します。そのようなオブジェクトにアクセスするには、*(アスタリスク)を変数名の前につけて呼び出します。

Day 80 のまとめ

今日は 8 章のタプル構造体などのデータ構造についてと、 9 章の 値渡し参照渡し について読み進めてみました。

  • 第8章 混成的なデータ構造を使う
    • タプル
    • 構造体
    • タプル構造体
  • 第9章 関数を定義する
    • 自作の関数を定義して呼び出す方法
    • 同じ名前の関数は、いつ、どうすれば複数持てるのか
    • 関数に引数を渡す方法(値渡しと参照渡し)
    • 関数から単純な値や複合的な値を返す方法
    • 関数を早期に終える方法
    • オブジェクトへの参照、どう操作できるのか
GitHubで編集を提案

Discussion