Closed5
第2章 [作って学ぶ] ブラウザのしくみ - URL分解 メモ
0章のスクラップはこちら
第二章のURL分解は、特に難しいこともなくサクッと終わった
- URL parseの実装
- testの実装
未解決ポイント
所有権
外部公開するgetterメソッドに、cloneを用いて各メソッドを呼び出すのは、所有権の関係があるのは分かるが、今ひとつ所有権でメモリがどう開放されるのかとかが分からなかった。
解決ポイント
テスト
Rustのユニットテストの書き方がわかってとてもスッキリ!いいね!
次はTDDっぽく書きたい!
実は、 cd saba_core
をして階層を移動せずに、トップレベルで cargo test
を実行して、ビルドエラー的なのが出て無駄な格闘をしていたりした。途中で気がついてすんなり進めた。
あと、linterとか入れていないせいか、スペルミスでとてもコケた。
あと、.split()
かと思ってたら .splitn()
で、integer受け入れられないよ?とかエラーでてびっくりしたりました。でもテスト書いて動かすとすぐに挙動が分かるから良いね!
&must self
ってなに?
Q. A. 可変参照を受け取るselfの引数指定
今回は、 self
を変更するからこの渡し方をしていたと!
pub fn parse(&mut self) -> Result<Self, String> {
if !self.is_http() {
return Err("Only HTTP scheme is supported.".to_string());
}
self.host = self.extract_host();
self.port = self.extract_port();
self.path = self.extract_path();
self.searchpart = self.extract_searchpart();
Ok(self.clone())
}
関数でslefを引数に受け取る3つの形の1つ
-
self
→ 所有権を受け取る(関数を呼び出すと、インスタンスの所有権は関数に移ります)。 -
&self
→ 不変参照を受け取る(インスタンスを変更できない)。 -
&mut self
→ 可変参照を受け取る(インスタンスを変更可能)。
Result<Self, String>
してたけどどれが対象?
Q. Selfは cloneして返却しているから
Stringはエラーメッセージに対して
- Slef =>
Ok(self.clone())
- String =>
return Err("Only HTTP scheme is supported.".to_string());
pub fn parse(&mut self) -> Result<Self, String> {
if !self.is_http() {
return Err("Only HTTP scheme is supported.".to_string());
}
self.host = self.extract_host();
self.port = self.extract_port();
self.path = self.extract_path();
self.searchpart = self.extract_searchpart();
Ok(self.clone())
}
}
このスクラップは8日前にクローズされました