コーヒー飲んでずっと人を待つということをやっていた
diary
coffee
皇琲亭でブレンドコーヒーとストレートを2種類飲んだ。
久しぶりに行ったが、あの雰囲気はよかった。
後、1杯飲むなら高いが2杯以上だとちょうどよい値段になる。
friend
友達に対する興味が一瞬で消えた。
あんなに強い興味があったのに。
原因はなんだろうか、相手が1時間半も遅刻したからだろうか。
今日の勉強
rust
pp.118-128
6章
if let
記法if
とlet
をより徐儒調整の少ない方法で組み合わせ- 残りを無視しつつ、1つのパターンにマッチする値を扱うことができる
- match式だと追加すべき定型コードが多すぎる
- matchで強制される包括性チェックを失う
- やりたいことと、関係性を得ることが包括性チェックを失うのに適切な代償となりうるかによる
if let pattern = formula {
code
} else {
code
}
memo:
- 借用と参照にまだ慣れていない
まとめ:
enum
を使用してワンセットの列挙された値のどれかになりうる独自の型を生成Option<T>
でエラーを回避できる
- enumの値がデータを乃武に含む場合、処理すべきケースの数に応じてmatchかif letを使って、値を取り出し使用できる
- Rustが型安全性を保証する
- Compilerが各関数の予期する型の値のみを関数が得ることを確かめてくれる
7章
- コードのまとまりをよくする
- 関係した機能をまとめ、異なる特徴をもつコードを分割
- 見つけたり、変更したりするために、どこを探せばよいかを明確にできる
- プログラムの整理
- 複数のファイル・複数のモジュールに分割
- パッケージは、複数のバイナリクレートからなり、またライブラリクレートを最大1つもつことができる
- 一部を分離したクレートにし、外部依存にするのもよい
- 関係した機能をまとめ、異なる特徴をもつコードを分割
- 機能のグループ化 + 実装の詳細のカプセル化
- より高いレベルでコードを使える
- 実証の詳細を知ることなく、手続きで、そのコードを呼び出せる
- コードの公開・非公開も書き手によって決定される
- プログラマが記憶しておくべき細部の制御をできる
- より高いレベルでコードを使える
- スコープ
- 「スコープ内」として定義される名前の集合
- 同じ名前の者を2つの同じスコープ内には持てない
- 特定の名前 -> どの要素か -> 何を意味するか
- 「スコープ内」として定義される名前の集合
- モジュールシステム
- コードのまとまりを保つためのたくさんの機能
- 公開・非公開、スコープ内外の管理等
- コードのまとまりを保つためのたくさんの機能
- クレート
- バイナリクレート
- ライブラリクレート
- 関連した機能を1つのスコープにまとめる
- ライブラリか実行可能ファイルを生成する木構造をしたモジュール群
- 関連した機能を1つのスコープにまとめることで、その機能が複数のプロジェクト間で共有しやすいようにする
- クレートの機能をそれ自身のスコープの中に入れたままにする
- 名前の衝突を予防する
- クレートの機能をそれ自身のスコープの中に入れたままにする
- クレートルート
- Rustコンパイラの開始地点
- クレートのルートモジュールを作るソースファイルのこと
- パッケージ
- ある機能群を提供する1つ以上のクレート
- クレートをビルドし、テストし、共有することができるCargoの機能
- Cargo.tomlがそれらのクレートをどのようにビルドするか説明するファイル
- Cargoがクレートルートファイルをrustcに私、ライブラリやバイナリをビルドする
main.rs
やlib.rs
について、パッケージ名と同じ名前を持つクレートルートであるという慣習があるので、Cargo.tomlでは省略できるsrc/bin
ディレクトリに置けば、複数のバイナリクレートを持たせることができる
- Cargoがクレートルートファイルをrustcに私、ライブラリやバイナリをビルドする
- Cargo.tomlがそれらのクレートをどのようにビルドするか説明するファイル
- 規則がある
- パッケージは0か1個のライブラリクレートを持つ
- バイナリクレートはn個持ってよい
- 少なくとも1つのクレートを持つ必要がある
- モジュール
- クレート内のコードをグループ化し、可読性と再利用性を上げるのに役立つ
- 関連する定義を1つにまとめ、関連する理由を名前で示せる
- グループ単位でコードを読める
- 新しい機能を追加するときはどこに置けばよいか分かりやすい
- 関連する定義を1つにまとめ、関連する理由を名前で示せる
- プライバシーも制御できる
- コードの外側で使える(public)
- 内部の実装の詳細であり、外部では使えない(private)
- クレートルートと呼ばれる理由
- モジュールツリーと呼ばれるクレートのモジュールの根っこ(ルート)にmain.rsとlib.rsの中身がcrateというモジュールを形成するから
- 親子関係やディレクトリ構成によく似ている
- 要素を見つけるためにどこを探せばいいのかを教えるためにパスを使う
- クレート内のコードをグループ化し、可読性と再利用性を上げるのに役立つ
mod name {
mod
struct
enum
const
fn
}
- パス
- 絶対パス
crate::xxx::yyy
- クレートルートからスタートする
- 相対パス
(self/super::)xxx::yyy
- 現在のモジュールからスタートする
- 使い分け方
- プロジェクトによって決める
- 要素を定義するコードを、その要素を使うコードと別々に動かすか一緒に動かすか、どちらが起きそうか
- 両方動かすなら絶対パスを更新する必要があり
- 関数だけ動かすなら相対パスを更新する必要がある
- 絶対パス
- プライバシー境界の設定
- 外部のコードが知ったり、呼び出したり、依存したりしてはいけない実装の詳細をカプセル化する線引き
- 関数や構造体を非公開にしたいならモジュールに入れればよい
- 標準で非公開という選択をRustはとっている
- 内部コードのどの部分が外部のコードを壊すことなく変更できるかを知れる
- 親モジュールの要素は子モジュールの非公開要素を使えない
- 子モジュールは実装の詳細を覆い隠す
- 子モジュールはその祖先モジュールの要素を使える
- 子モジュールは自分の定義される文脈を見ることができる
- 外部のコードが知ったり、呼び出したり、依存したりしてはいけない実装の詳細をカプセル化する線引き