🦀

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

2022/12/07に公開

Day 79 のテーマ

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

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

第6章 基本のデータ型を使う

この章での内容:

  • 数値リテラルを 16 進 / 8 進 / 2 進の表記で書く方法
  • 数値リテラルを読みやすくするためにアンダースコア (_) を使う方法
  • 巨大な数や微細な数を指数表記でコンパクトに書く方法
  • 基本となる 12 種類の整数型、2 種類の浮動小数点型の名前と範囲と用途
  • 「具体的な型」または「未制約な型」の数値リテラルを指定する方法
  • 数値を他の数値型に変換する方法
  • その他のプリミティブ型 (真偽値、文字、空タプル)
  • 型推論のしくみ
  • 配列やベクターの型を表する方法
  • コンパイル時の定数に名前を付ける方法
  • コンパイラを使って式の型を調べる方法

型推論についてのメモ

Rust のコンパイラは賢く常に型を特定しようと働いてくれています。この型推論のアルゴリズムは次のような動き方になります。

  • 型が明示的に指定されている変数の型は指定された型に決まる
  • 変数や式の型が未指定で、ある特定の型でないと有効にならない式であったり宣言の場合、その特定の型に決まる
  • ソースコードの解析終了時にコンパイラが 未制約な整数型と判定していると、i32 型と定義される

整数型についてのメモ

占有バイト数 最小値 最大値
i8 1 -128 127
i16 2 -32,768 32,767
i32 4 -2の31乗 2の31乗-1
i64 8 −2の63乗 2の63乗-1
i128 16 -2の127乗 2の127乗-1
isize 2 / 4 / 8 -2の15乗 / -2の31乗 / -2の63乗 2の15乗-1 / 2の31乗-1 / 2の63乗-1
u8 1 0 255
u16 2 0 65,355
u32 4 0 2の32乗-1
u64 8 0 2の64乗-1
u128 16 0 2の128乗-1
usize 2 / 4 / 8 0 2の16乗-1 / 2の32乗-1 / 2の64乗-1

空タプルについてのメモ

() 型 (空タプル) の値は型名と同じく () です。void 型のようなもの。

第7章 列挙と照合

この章での内容:

  • 変数定義で有限な選択肢の集合から値を選ぶ時に便利な列挙 (enum) の使い方
  • enum を使って独自の共用体 (union) を実装する方法
  • パターン照合の match 構造で enum をどう扱えるのか
  • match 呼応像を使って、その他のデータ型 (整数、文字列、キャラクタなど) を扱う方法
  • データフィールドを含む列挙を定義し、それらをリテラルと照合する方法
  • match 文のパターンで変数を定義する方法
  • match 式の使い方
  • ブール型のガードを使って match 構造のパターン照合を汎用化する方法
  • if-letwhile-let の構造をどう使うのか

enum と match についてのメモ

enummatch に登場する用語についての整理をしておきます。

バリアント

enum City {Tokyo, SanFrancisco, London, Barcelona};

上記のように定義されている enum のそれぞれの値のことを バリアントと呼びます。
内部的にはそれぞれが 0u8, 1u8, 2u8, 3u8 の値で表現されています。

アーム と ファットアロー

match 構造では条件ごとに実施する各ケースを並べます。そのそれぞれぞれをアームと呼びます。

match city {
    City::Tokyo => print!("TK"),  // <- この各ケースが "アーム"
    City::SanFrancisco => print!("SF"),
    City::London => print!("LD"),
    City::Barcelona => print!("BA"),
}

バリアント名と実施する式の間に挟まれている =>ファットアローと呼びます。

ファットアローの右側の式ですが、次のようにブロックを利用して複数の式を実行出来ます。

match city {
    City::Tokyo => { let name = "Sugamo";, print!("{}", name); }
    :
    :

アームと全てのケース

enum で定義した全てのバリアントをアームで宣言しないとエラーになってしまうのですが、どんな値にも一致するようなアームを定義したい場合は _ (アンダースコア記号) を使って表現できます。

match city {
    City::Tokyo => print!("TK"),
    _ => {},

ガード

パターンにブール条件を宣言することができます。それをガードと呼びます。

for n in -5..5 {
    println!("{}", match n {
        0 => "ZERO",
        1 => "ONE",
        _ if n < 0 => "負の数",
        _ => "その他",
    });
}

_ if n < 0 このように if 条件がガードです。

if-let 構造についてのメモ

次のように enum のバリアントにマッチするかどうかを判断してバリアントを利用するような場合に if let 構造が利用できます。

enum Foo {
    A(u32),
    B(char),
    C(bool),
}

let foo = Foo::A(5);

if let Foo::A(n) = foo {
    println!("数値: {}", n);
}

Day 79 のまとめ

今日は 6 章の基本データ型と 7 章の enummatch について読み進めてみました。

  • 第6章 基本のデータ型を使う
    • 数値リテラルを 16 進 / 8 進 / 2 進の表記で書く方法
    • 数値リテラルを読みやすくするためにアンダースコア (_) を使う方法
    • 巨大な数や微細な数を指数表記でコンパクトに書く方法
    • 基本となる 12 種類の整数型、2 種類の浮動小数点型の名前と範囲と用途
    • 「具体的な型」または「未制約な型」の数値リテラルを指定する方法
    • 数値を他の数値型に変換する方法
    • その他のプリミティブ型 (真偽値、文字、空タプル)
    • 型推論のしくみ
    • 配列やベクターの型を表する方法
    • コンパイル時の定数に名前を付ける方法
    • コンパイラを使って式の型を調べる方法
  • 第7章 列挙と照合
    • 変数定義で有限な選択肢の集合から値を選ぶ時に便利な列挙 (enum) の使い方
    • enum を使って独自の共用体 (union) を実装する方法
    • パターン照合の match 構造で enum をどう扱えるのか
    • match 呼応像を使って、その他のデータ型 (整数、文字列、キャラクタなど) を扱う方法
    • データフィールドを含む列挙を定義し、それらをリテラルと照合する方法
    • match 文のパターンで変数を定義する方法
    • match 式の使い方
    • ブール型のガードを使って match 構造のパターン照合を汎用化する方法
    • if-letwhile-let の構造をどう使うのか
GitHubで編集を提案

Discussion