回答編集履歴
3
RefCellとRcについて追記しました
answer
CHANGED
@@ -40,4 +40,14 @@
|
|
40
40
|
|
41
41
|
そのあと「お気楽 Rust プログラミング超入門 -- 二分木」の設計と実装を参考に、ツリーの構造を変えて、再度チャレンジするのが良いと思います。回答として動作するプログラムを示せなくて残念なのですが、大幅な書き直しになってしまいそうなのです。
|
42
42
|
|
43
|
-
やってみてわからないところがあれば、再度質問してください。(コードが大きく変わりそうなので新しい質問を立ててもらったほうがよいかもしれません)
|
43
|
+
やってみてわからないところがあれば、再度質問してください。(コードが大きく変わりそうなので新しい質問を立ててもらったほうがよいかもしれません)
|
44
|
+
|
45
|
+
---
|
46
|
+
|
47
|
+
**追記**
|
48
|
+
|
49
|
+
> RefCellを使って複数の所有者を持てるようにしました。
|
50
|
+
|
51
|
+
最初の回答で書き忘れましたが、`RefCell` は複数の所有者を持てる型ではなくて、内側のミュータビリティ(interior mutability)を提供する型です。複数の所有者を持てる型は `Rc`(Reference Counted、参照カウントの意味)になります。
|
52
|
+
|
53
|
+
今回の`build_tree`関数では`Rc`は使わなくても大丈夫そうです。
|
2
リンク先のページの名前に節番号を追加
answer
CHANGED
@@ -33,8 +33,8 @@
|
|
33
33
|
|
34
34
|
なぜこのような定義が良いのか一言で説明するのは難しく、英語ですみませんが、まずはこちらのチュートリアルを読んでもらうのがよいと思います。
|
35
35
|
|
36
|
-
- [Learning Rust With Entirely Too Many Linked Lists -- Basic Layout](https://rust-unofficial.github.io/too-many-lists/first-layout.html)
|
36
|
+
- [Learning Rust With Entirely Too Many Linked Lists -- 2.1 Basic Layout](https://rust-unofficial.github.io/too-many-lists/first-layout.html)
|
37
|
-
- [Learning Rust With Entirely Too Many Linked Lists -- Using Option](https://rust-unofficial.github.io/too-many-lists/second-option.html)
|
37
|
+
- [Learning Rust With Entirely Too Many Linked Lists -- 3.1 Using Option](https://rust-unofficial.github.io/too-many-lists/second-option.html)
|
38
38
|
|
39
39
|
これらのページでは単方向リンクリストのデータ構造を設計しています。このチュートリアルの2章(A Bad Singly-Linked Stack)と3章(An Ok Singly-Linked Stack)の内容はツリーの設計と実装にも大いに役立つと思いますので、上で紹介したページだけでなく、前後のページもぜひ読んでみてください。
|
40
40
|
|
1
誤字の修正
answer
CHANGED
@@ -5,7 +5,7 @@
|
|
5
5
|
|
6
6
|
ツリーのデータ構造内で `Ref` を使っていますが、これは **対象を所有しない** ポインタです。このような構造ですとライフタイムの関係でうまくいきません。なぜならツリーが要素を所有しておらず、ツリー自体の寿命よりも早く、その要素がメモリから解放されてしまうからです。
|
7
7
|
|
8
|
-
つまりデータ構造を変えて、ツリーが
|
8
|
+
つまりデータ構造を変えて、ツリーが要素を所有するようにしないといけません。そうすればツリー自体が生きている間は、その要素もメモリ上に存在することが保証されます。そのためには **対象を所有する** `Box` ポインタを使う必要があります。
|
9
9
|
|
10
10
|
おすすめはしませんが、ひとつの修正方法としては、いまの `struct RefTreeNode` と `enum RefTree` のフィールドで、`RefTree` か `RefTreeNode` を持つフィールドの型を、`Box<RefTree>` や `Box<RefTreeNode>` に変えることが考えられます。
|
11
11
|
|
@@ -38,6 +38,6 @@
|
|
38
38
|
|
39
39
|
これらのページでは単方向リンクリストのデータ構造を設計しています。このチュートリアルの2章(A Bad Singly-Linked Stack)と3章(An Ok Singly-Linked Stack)の内容はツリーの設計と実装にも大いに役立つと思いますので、上で紹介したページだけでなく、前後のページもぜひ読んでみてください。
|
40
40
|
|
41
|
-
そのあと「お気楽 Rust プログラミング超入門 -- 二分木」の設計と実装を参考に、ツリーの構造を変えて、再度チャレンジ
|
41
|
+
そのあと「お気楽 Rust プログラミング超入門 -- 二分木」の設計と実装を参考に、ツリーの構造を変えて、再度チャレンジするのが良いと思います。回答として動作するプログラムを示せなくて残念なのですが、大幅な書き直しになってしまいそうなのです。
|
42
42
|
|
43
43
|
やってみてわからないところがあれば、再度質問してください。(コードが大きく変わりそうなので新しい質問を立ててもらったほうがよいかもしれません)
|