テストステ論

高テス協会会長が, テストステロンに関する情報をお届けします.

(rust report) Rust docのクロージャ章を読んだのでおれの理解をまとめる

https://doc.rust-lang.org/book/closures.html

Rustのクロージャ章を読むには, 所有権まわりの知識を再確認しなければならなかった. おれなりにこう理解したということをまとめる.

  • Rustが所有権という概念を導入したのは, リソースリークをなくすためである. スタックを解放する時にリソースを解放するテクニックをRAIIといい, C++ではよく使われている. Rustでは, RAIIを強制することにした.
  • 所有権はスタック上に確保された変数に結びついている.
  • 所有権は, 解放する責務を持つ所有権が存在し, 所有権を明け渡すことをmoveといい, 所有権を解放はしないが一旦使いますをborrowという. Rustのデフォルトはmoveであり, borrowをするには&を使う必要がある.
  • Copy traitは, moveを「コピーの所有権をとる」に書き換える.
  • mutというのは, その変数が持つ所有権を通じて, その変数を束縛したデータを変更しますよという意思表示である.
  • クロージャは, 自分が定義された環境をデフォルトではborrowする. 定義されたスタック上でborrowするのと大差ない.
  • クロージャをmutで定義するというのは, それが定義された環境を変更しますよということとなる.
  • moveクロージャは, 環境の所有権を奪い取る.
  • moveクロージャは, ふつうのクロージャと違い, 元のスタックを共有せず, 自身のスタックを持つ. (ふつうの関数と変わらない)
  • moveクロージャは, クロージャを返したい時に利用する. (その他に使いたい場面が思い浮かばない) この時, クロージャはtraitでありコンパイルタイムにサイズがわからないため, Boxとする必要がある. これも常套句である.
  • Boxを使うとヒープに確保する. それ以外はスタックに確保することと変わらない.

moveクロージャが, 自身がアクセスした変数の所有権だけを奪い取るのが全部奪い取るのかは読み取れなかった. (たぶん前者だが, 後者でも構わない. なぜならばクロージャを返す時にしか使わないと思うから)

ライトブーストがしばらく死ぬほど忙しかったが, 2.2.6で一段落したため, またRustに戻った. 今後もやっていく.