読者です 読者をやめる 読者になる 読者になる

テストステ論

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

(rust report) interior mutability

Interior mutability in Rust: what, why, how?

のシリーズを読んだのでまとめる.

Rustのmutabilityにはexteriorとinteriorがある.

exterior mutabilityとはユーザがmutで明示的に指定するmutabilityのこと. Rustのstructは部分的にmutableにするということが出来ない. だから, mutを指定すると全部mutableになる. all or nothing policy.

その構造自体は本質的にimmutableなもので, structの中にrefcountを埋め込みたい場合などは, CellやRefCellを使う. (CellとRefCellの違いは, Cellはcopy semanticsである点と, RefCellはruntime borrow checkerが効くこと) これは内部的にUnsafeCellという構造を使って実装されており, 言語的な魔法により上書きが出来る. これによって, ある構造の中で部分的にmutableにすることが出来る. このようなmutabilityは, interior mutabilityという. (RcやArcは少なくとも概念的にはこのようなパーツを使って実装されている) interior mutabilityを使うべき場面としては以下の4つが挙げられている.

  1. Introducing mutability inside of something immutable: RcやArcを作るような場面です
  2. Mutating implementations of Clone: clone()を読んだ時に自身の状態を変更したい場面など (refcountの話と変わらない)
  3. Implementation details of logically immutable methods: キャッシュやメモ化のことです
  4. Mutating reference-counted variables: 可変な木構造を実装する例が紹介されています. Rcなどのrefcountパーツの中にRefCellなどを格納して変更可能にするイディオム

なぜこういう設計になったかは分からない. なぜScalaなどではprivate varとして指定出来ることをなぜRustはこのようなめんどうな方法で実現しなければいけないのか. 知ってる人がいたら教えてほしい. *1

シリーズにはその他, Rc, Arc, Atomic, RwLock, Mutexなどにどういう得失があるのかということが書かれている. 興味がある人は読むこと.

*1:一応, 1) syntaxにvarを入れたくなかった 2) 寿命計算の制約かなにか ではないかと想像している