🦀

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

2022/12/10に公開

Day 83 のテーマ

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

残りもう少しなので、この週末中に読み終えようと思っています。

第15章 範囲とスライス

この章での内容:

  • 終点を含まない範囲も、終点を含む範囲も指定できること
  • 範囲を使って、配列やベクターやその他のスライスを定義して使う方法

範囲についてメモ

範囲とは、Range<T> というジェネリック型を具現化したものです。

let range: std::ops::Range<usize> = 1..10;

println!("
    Range: {:?},
    Start: {},
    End: {},
    Length: {}",
    range, range.start, range.end, range.len());

スライスについてメモ

配列やベクターは、異なる特徴は持っていますが、複数の要素を持つという点で同じようなデータ構造です。これらが持つ要素を参照するためにスライスという方法があります。

{
    let arr = [0, 1, 2, 3, 4, 5];
    let vec = vec![0, 1, 2, 3, 4, 5];
    let sarr = &arr[1..3];
    let svec = &vec[3..5];
    println!("{:?}, {:?}", sarr, svec);
}

スライスにはファットポインタという構造があり、次の 2 つの値を持っています。

  • スライスの最初の要素を指すポインタ
  • スライスに含まれる要素数

第16章 イテレータを使う

この章での内容:

  • Rust でキャラクタ (文字) が文字列に、どう格納されるのか。なぜ直接アクセスできないのか
  • イテレータを使って、文字列のキャラクタまたはバイトを読む方法
  • イテレータを使って、ベクターや配列から項目を抽出する方法
  • 非可変イテレータを使って、ベクターや配列やスライスの項目への参照を取得する方法
  • 可変イテレータを使って、ベクターや配列やスライスの項目を変更する方法
  • for ループでイテレータを使う簡略記法
  • イテレータアダプタ (filter, map, enumerate) の使い方
  • イテレータコンシューマ (any, all, count, sum, min, max, collect) の使い方
  • イテレータの連鎖と遅延評価について

イテレータとは、シーケンスの現在位置から項目を抽出した後、それを次の位置まで進めるという動作を実行するオブジェクトのことです。

fn print_codes(s: &str) {
    for c in s.chars() {
        println!("{}: {}", c, c as u32);
    }
}
print_codes("abcde");

into_iter() を使用して配列やベクターのイテレータを使用します。

for item in vec![1, 2, 3, 4, 5].into_iter() {
    println!("{} ", item * 2);
}

into_iter() を省略して次のように記述できます。

for item in &vec![1, 2, 3, 4, 5] {
    println!("{} ", *item * 2);
}

iter() を使用して書くことも可能です。

for item in vec![1, 2, 3, 4, 5].iter() {
    println!("{} ", *item * 2);
}

イテレータジェネレータ

イテレータコンシューマ

  • どれかを判定

  • すべてを判定

  • 個数を数える

  • 値を合計する

  • 最小値を求める

  • 最大値を求める

  • コレクションを作る

第17章 入出力とエラー処理

この章での内容:

  • プログラムを起動したコマンドラインから引数を受け取る方法
  • プログラム終了時のステータスコードを OS に返す方法
  • プロセスの環境変数を取得/設定する方法
  • ランタイムエラーを処理する技法とベストプラクティス
  • コンソールのキーボード入力を読み出し、スクリーンに出力する方法
  • プリミティブ型を文字列に変換する方法
  • バイナリファイルを読み書きする方法
  • テキストファイルを行ごとに読む方法

Day 83 のまとめ

  • 第15章 範囲とスライス
    • 終点を含まない範囲も、終点を含む範囲も指定できること
    • 範囲を使って、配列やベクターやその他のスライスを定義して使う方法
  • 第16章 イテレータを使う
    • Rust でキャラクタ (文字) が文字列に、どう格納されるのか。なぜ直接アクセスできないのか
    • イテレータを使って、文字列のキャラクタまたはバイトを読む方法
    • イテレータを使って、ベクターや配列から項目を抽出する方法
    • 非可変イテレータを使って、ベクターや配列やスライスの項目への参照を取得する方法
    • 可変イテレータを使って、ベクターや配列やスライスの項目を変更する方法
    • for ループでイテレータを使う簡略記法
    • イテレータアダプタ (filter, map, enumerate) の使い方
    • イテレータコンシューマ (any, all, count, sum, min, max, collect) の使い方
    • イテレータの連鎖と遅延評価について
  • 第17章 入出力とエラー処理
    • プログラムを起動したコマンドラインから引数を受け取る方法
    • プログラム終了時のステータスコードを OS に返す方法
    • プロセスの環境変数を取得/設定する方法
    • ランタイムエラーを処理する技法とベストプラクティス
    • コンソールのキーボード入力を読み出し、スクリーンに出力する方法
    • プリミティブ型を文字列に変換する方法
    • バイナリファイルを読み書きする方法
    • テキストファイルを行ごとに読む方法
GitHubで編集を提案

Discussion