てがみ: qatacri at protonmail.com | 統計 | 2023

202334100

Rust のライブラリを使う側としても作る側としても困ることの一つに、長期間保持する参照の扱いがある。

ライブラリがユーザーの持つデータへの参照を保持したいとする。そのデータの寿命はユーザー側が管理している。このとき、 C++ であれば生ポインタないし参照で保持しておけばいい。 Rust の &T は当然ながら静的に寿命が分かっていないといけないし、 self-referential structs も使えない。一般には Rc なり Arc なりを使うことになるが、どうやってデータを保持するのが適切かは、本来ユーザー側の使い方で決まる。静的に寿命が分かっているときもあれば、ライブラリ側では弱参照で保持して欲しいときもある。

原理的な問題を別にしても、 Weak<RefCell<T>> に対していちいち obj.upgrade().unwrap().borrow_mut() とか書くのは辛い。