🦀
100日後にRustをちょっと知ってる人になる: [Day 83]書籍: Rust プログラミング完全ガイド その7
Day 83 のテーマ
Day 82 までに Rust の書籍の Rustプログラミング完全ガイド の 1 章から 14 章までを読み終わりました。
- 第1章 Rustを始めよう
- 第2章 数値演算などの基本を把握しよう
- 第3章 オブジェクトに名前を付ける
- 第4章 実行の流れを制御する
- 第5章 データシーケンスを使う
- 第6章 基本のデータ型を使う
- 第7章 列挙と照合
- 第8章 混成的なデータ構造を使う
- 第9章 関数を定義する
- 第10章 ジェネリックな関数や型を定義する
- 第11章 メモリを割り当てる
- 第12章 データの実装
- 第13章 クロージャを定義する
- 第14章 変更可能な文字列を使う
- 第15章 範囲とスライス
- 第16章 イテレータを使う
- 第17章 入出力とエラー処理
- 第18章 データのカプセル化[メソッドとモジュール]
- 第19章 トレイトを使う
- 第20章 オブジェクト指向プログラミング
- 第21章 標準ライブラリのコレクション
- 第22章 所有権、移動、コピー
- 第23章 借用とライフタイム
- 第24章 さらにライフタイムについて
残りもう少しなので、この週末中に読み終えようと思っています。
第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 に返す方法
- プロセスの環境変数を取得/設定する方法
- ランタイムエラーを処理する技法とベストプラクティス
- コンソールのキーボード入力を読み出し、スクリーンに出力する方法
- プリミティブ型を文字列に変換する方法
- バイナリファイルを読み書きする方法
- テキストファイルを行ごとに読む方法
Discussion