Closed5

第2章 [作って学ぶ] ブラウザのしくみ - URL分解 メモ

堀川登喜矢堀川登喜矢

第二章のURL分解は、特に難しいこともなくサクッと終わった
https://github.com/TokiyaHorikawa/saba/pull/1

  1. URL parseの実装
  2. testの実装

未解決ポイント

所有権
外部公開するgetterメソッドに、cloneを用いて各メソッドを呼び出すのは、所有権の関係があるのは分かるが、今ひとつ所有権でメモリがどう開放されるのかとかが分からなかった。

解決ポイント

テスト
Rustのユニットテストの書き方がわかってとてもスッキリ!いいね!
次はTDDっぽく書きたい!

堀川登喜矢堀川登喜矢

実は、 cd saba_coreをして階層を移動せずに、トップレベルで cargo testを実行して、ビルドエラー的なのが出て無駄な格闘をしていたりした。途中で気がついてすんなり進めた。

あと、linterとか入れていないせいか、スペルミスでとてもコケた。
あと、.split()かと思ってたら .splitn()で、integer受け入れられないよ?とかエラーでてびっくりしたりました。でもテスト書いて動かすとすぐに挙動が分かるから良いね!

堀川登喜矢堀川登喜矢

Q. &must selfってなに?

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つ

  1. self → 所有権を受け取る(関数を呼び出すと、インスタンスの所有権は関数に移ります)。
  2. &self → 不変参照を受け取る(インスタンスを変更できない)。
  3. &mut self → 可変参照を受け取る(インスタンスを変更可能)。
堀川登喜矢堀川登喜矢

Q. Result<Self, String>してたけどどれが対象?

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日前にクローズされました