Samuel Becketの詩を思い出し、開発のために、上手な失敗を素早く失敗するためにどうするか、ということを考える。
Rustの勉強記録は、5.1節から5.3節にかけての、構造体に関して、その所有権とその実装例とそのメソッドについて。
diary
better fail
Samuel Becketの詩の1つのうちに ever tried, ever failed, no matter, try again, fail again, fail better というフレーズがあると覚えている。
これはコーディングやプロジェクトにおいても当てはまると思っている。それは、プロダクトから、チーム、個人、そして一定時間、問わない。
プロジェクトにおいては、この期間でこれだけをやって、リリースして反応を見て、うまくいかなかったら(たいていうまくいかないし何か問題があるので)、その問題を分析して、原因を特定して、また次にトライして、と繰り返す。
チームのコーディングにおいては、コードを書いてPR出して、レビューをもらって、ダメだったらそれを改善して、またRe-request Reviewして、と繰り返す。
さらに、もっと短い時間で、一時間でこれだけやろうとして、けれどできなかったとなったら、自分の技術的に分からないところがあるのか、それとも、要件や成すべきことを把握していないか、それとも、想定よりも難しいことが存在していたことがわかる。そこから、また、それらのことを解決したり分割したりして、また予測して、やってみて、と繰り返す。
挑戦して、失敗して、けれど失敗自体に問題はなくて、また挑戦して、失敗して、うまく失敗する。
失敗は一つの選択肢である、というのはよく言った言葉である。 開発においての失敗というのは大凡何らかのコミュニケーション不足や伝達不足(ユーザーとプロダクトの間、チーム間、自己認識いずれにおいても)があることが原因であり、それに早く気づき、それを早く解消し、早く形にするためには失敗に気づき、次にまたコミュニケーションをすることが開発の成功に繋がることである。
friend
会いたい人と会う予定を立てることがとても楽しい。
けれど、会いたい人が私と本当にこの予定を喜んでいるのか、不安になってしまうこともある。 しかし、それもまたこそばゆい喜びを産んでくれる。
今はとても幸せであり、こういう友を得られたことはとても良い。 (これを喪失したときは、またとても悲しみを産むのであろう。)
今日の勉強
rust
pp. 93 -100
5.1節
- 構造体データの所有権
- フィールドの方は所有権のあるものを使う
- 例えば、所有権のある
String
を使い、&str
は使わない - 理由:
- 全データをそのインスタンスに所有してもらう必要があるから
- 構造体全体が有効な間はずっと有効である必要がある
- 他の何かに所有されているデータへの参照を保持させるにはライフタイムを使う
- 例えば、所有権のある
- フィールドの方は所有権のあるものを使う
5.2節
- 単一の変数を使った実装から、タプルを使った実装へ、構造体を使った実装へとリファクタリングをしていく
- 単一の変数だと、引数に関連性があるのにそれを表現されないという問題がある
- 可読性と扱いやすさの問題がある
- 変数をグループ化する
- タプルで実装すると、要素に名前がないので、計算が不明瞭になるという問題がある
- データの意味をコードに載せたい
- ラベル付けするのに構造体を使う
- 関数に渡すのは借用を用いる(
&
を用いる)- 理由は、main関数で所有権を保つため
- 関数に渡すのは借用を用いる(
- 構造体を使う際に、デバッグ中にインスタンスを出力しフィールの値を確保したい場合
- 構造体なので、整形する方法が自明ではない、
{}
の代わりに、{?}
かpretty-printな{:?}
を使う。Debug
を呼ばれる出力を使いたいと指示する
- この機能を構造体で使うようにするのに、
derive
注釈をして、明示的に選択をしなければならない- (なお、これら一連のやるべきことはcompilerのError messageから何をやるべきかわかる)
- 構造体なので、整形する方法が自明ではない、
- 単一の変数だと、引数に関連性があるのにそれを表現されないという問題がある
5.3節
- メソッド記法
- 構造体と関数をより緊密に結びつける
- 他のどんな型でもうまく動作しなくする
- メソッドについて
- 構造体(もしくは
enum
かTrait Object)の文脈で定義される - 最初の引数は必ず
self
self
はメソッドが呼び出されている構造体インスタンスを表す
- 構造体(もしくは
- 構造体と関数をより緊密に結びつける
メソッドの書き方は以下の通り:
impl 構造体名 {
fn 関数名(self (もしくは &self)) {
... self.xxx ...
}
}
- メソッドの使い方
インスタンス.関数名()
- メソッドの引数は、関数と同じで、所有権を奪えたり、不変借用したり、可変借用したりできる
- メソッドの利点:
self
の型を繰り返し書く必要がなくなる- 体系化できる
- ライブラリ内の各所を探させるのではなく、
- この方のインスタンスでできることを1つのimplにまとめられる。