Dev Study
← 解説「ノードを Rust で持つ — 親は Weak、子は Rc、付け外しは RefCell」に戻る

サンプルコードで身につける: ノードを Rust で持つ — 親は Weak、子は Rc、付け外しは RefCell

解説で学んだ概念を、3つの具体例で確認します。素朴な例から実務寄りの例へと進みます。

1Rc の子・Weak の親・RefCell の子リスト

ツリーを Rust で持つ定番の 3 点セットです。親→子は (所有)、子→親は (所有しない)なので循環せず、子のリストは に包んで &self のまま追加できます。実行すると body の strong_count が 2(変数と親の children)、html の strong_count が 1 のままと出て、html を drop すると body から見た親が None になり、Weak の upgrade も失敗することが確かめられます。

Rust

2textContent と getElementById を DOM Standard の定義どおりに書く

の getter は子孫の Text をつないだもの、setter は子を全部外して を 1 つ付けるだけ( Standard の string replace all)、 は (深さ優先で文書に書いた順)で最初の、という 3 つの定義をそのまま Rust にしました。実行すると getElementById("y") が兄弟の <p id="y"> ではなく深い方の <span id="y"> を返すこと、setter の後は子が 1 つになり外された span の親が無くなること、空文字を入れると子が 0 になることが出ます。

Rust

3実務に写す: 入れ子の設定を Rc / Weak で持ち、親を辿ってパスを作る

JSON のような入れ子の設定を同じ Rc / Weak / RefCell の木で持ち、葉から親を Weak で辿って server.tls.cert のようなを作ります。親を Weak にする理由は DOM と同じで、親→子→親の循環でメモリが解放されなくなるのを避けるためです。実行すると 3 つの葉のパスと値、cert の strong_count が 3 → 2 と変わる様子、根を捨てた後は親が消えて path() が "cert" だけになる様子が出ます。

Rust

図やコードに出てくる用語(タップで説明)