Rust the book - 第8章

Posted by johtani on Thursday, April 16, 2020

目次

前回の記事はこちら。自分用のメモなので、読みにくいかもです。

第8章

7章はパッケージなので後回しにして、8章に入ります。 8章はコレクションです。

ベクタ型

  • ベクタは同じ型の値だけ保持可能。
    • ジェネリクスで型を指定可能 - Vec<i32>とか。
  • vec!マクロで初期値とか設定すると便利。
  • ベクタに値を追加するのはpush。もちろん値が変わるので元のベクタにはmutが必要
  • ベクタのスコープ(ライフサイクル)は要素に対する参照があるのとないので話が変わってくる
    • メモリの確保などの影響で、ベクタ全体に対して借用の規則が矯正されると。
  • ベクタの値を読むのはいくつか方法あり
    • getメソッドはOptionを返す
    • &v[2]の添字記法の場合はパニックの可能性あり
  • 走査(唐突に参照外しが出てきた)
    • 単純に値を取り出す場合はfor - in &v
  • Enumをベクタにいれることで、異なる型も保持可能(まぁ、Enumの型では固定されるけど)。
    • これだけのためにEnumを使うことってあるのかな?
    • トレイとオブジェクトに関する文章はちょっとわかりにくい。。。

説明以外のメソッドなどについてはAPIドキュメント見ましょうと(リンクも張ってくれてると嬉しいなぁと思ったり。まぁ、バージョンとかの絡みがあるから難しいか)。

文字列型

  • 文字列はUTF-8でエンコードされた文字を扱うための型。

  • strは文字列データへの参照。

  • String型は言語のコアではなく、標準ライブラリに入っている文字列型。

    • 他にもあるのか。。。OsStringとか。。。
  • 文字リテラルはDisplayトレイトを実装していると。

  • .to_string() = String::from

  • Stringはコレクションだから追加とかが可能なのか、なるほど。

  • push_strpush

  • +演算子での参照

    • &String&strに型強制(キャスト?)してくれる。してくれる場合としてくれない場合もあるのかな?s2の所有権は奪わない形で扱うのでs2はこのあとも使えていると。
    • ここでは、s1を変更したあとに所有権がs3に持っていかれてる?
    • format!を使うとどの所有権も奪わないので、これを使うほうが考え方は簡単そう。ただし、効率がいいかはわからん。
  • 添字記法でのアクセスをStringは許容していない

    • 文字の境界が必ずしも1バイトとは限らないから。
    • スライスも同様。
  • 基本的には.chars()で文字としてアクセスするのが良い。

  • 逆にバイト表現を得る方法はどうするんだろう?

ハッシュマップ

  • いろんな呼び方あるよね。Rustではハッシュマップだよ。
  • ハッシュマップはuseしないと使えない
  • キーは1つの型、値も1つの型
  • タプルのベクタからcollectで生成。なるほど。
    • タプルのベクタだと、タプルの中身は同じものであることが言える?
      • -> 言える。エレメント数が異なるとコンパイルエラーになった
  • 所有権周りの話。
    • これ、ベクタのときに話してほしい感じがした。
    • 値を渡すか参照を渡すかによって話が変わってくる。詳しくは10章
    • このあたりが自分が混乱していた元だ。
  • entryinsertの違い
    • entryの戻り値はEntryというenumでor_insertというメソッドがありそれを使うと存在しない場合だけinsertが呼ばれる。
      • これ便利だ。毎回existあたりで存在チェックしてた気がする。
  • or_insertは可変参照&mut Vを返す。
    • これをlet countで束縛するときに、中身が可変かどうかをcountには指定しないのか。。。

まとめ

一応、大学などで習ってた(はず)ですが、 スタックとヒープを意識して考えないといけないなぁというのを何度か意識させられた感じです。

あと、これはRustに限らずですが、それぞれがどんな関数を持っているか、どんなメソッドを持っているか、どんなマクロが存在するかなどを探すときにみんなどうしてるんだろう? 人に教えてもらっているのか、APIリファレンスを探すのか、そういったところをみんながどういう感じにプログラミング言語を勉強しているか、業務で書いているのかと言うのが気になりました。


comments powered by Disqus