W.I.S. Laboratory
menu-bar

Rust


RustのRcとCellを使って参照カウント式スマートポインタを作ってみる

Rustで参照カウント式のスマートポインタを使いたい場合、Rc<RefCell<T>> を使うのが定石になっている。
しかしRustでは構造体のフィールドごとにミュータブル・イミュータブルを切り替えたい場合、ミュータブルにしたいフィールドをCellでラップすることが多い。(ミュータブル・イミュータブルの切り替えが構造体単位でしかできないので)
Cellでラップするとそのフィールドにアクセサメソッドが追加され、構造体がイミュータブルであっても書き込みができるようになる。
つまり構造体自体はイミュータブルにしておいて、値を変更したいフィールドだけをCellでラップし、get()/set()メソッドを使ってアクセスする、という具合だ。
こうすることで、書き換えてはならないフィールドをうっかり書き換えてしまうということを防ぐことができる。

このように作成した構造体をRcでラップすると、使い勝手はそのままで参照カウント式にできる。
ただし、RustのStringは構造体なので(u8のVector)、String型のフィールドをミュータブルにしたい場合はCellではなくRefCellでラップしなければならない。
ちなみにRustの参照カウントは、参照カウンタが自動的にインクリメントしないので、変数に代入するときも、関数の引数として渡すときも、clone()メソッドを書いて手動でインクリメントさせる必要がある。(デクリメントはDropトレイトが自動的にやってくれる)


[ 戻る ]
saluteweb