私はRustのASTを操作しようとしています。たくさんの操作があり、私は木を不変にしたいので、時間を節約するためにすべての参照はRc
です。AST操作のためのRc内のダウンキャスト形質
マイツリーノードは次のようになります。
enum Condition {
Equals(Rc<Expression>, Rc<Expression>),
LessThan(Rc<Expression>, Rc<Expression>),
...
}
enum Expression {
Plus(Rc<Expression>, Rc<Expression>),
...
}
は、私は、同じタイプの別のノードに指定されたタイプのランダムなノードを交換したいです。ツリー上の汎用操作を行うために、私は特性を作りました:
trait AstNode {
fn children(&self) -> Vec<Rc<AstNode>>;
}
そして、すべてのノードがこれを実装しています。これにより、各オペレーションの各ノードタイプを破棄せずに、単にchildren()
と呼ぶだけでツリーを歩くことができます。
また、ノードのクローンを作成してそのうちの1つのみを更新し、残りのノードはそのままにしたいと考えています。適切な具体的なタイプのノードを生成できたとします(私が間違っているとプログラムがうんざりするのはうれしいです)。私の計画は、childen()
によって返された子供たちを取るそれらのいずれかを交換し、同じ列挙型変異体のノードを構築するためにclone_with_children()
を呼び出すことです
trait AstNode {
fn clone_with_children(&self, new_children: Vec<Rc<AstNode>>) -> Self
where Self: Sized;
}
が、1つのノードを持つ:私は、形質に次のメソッドを追加します置き換えられました。
私の問題は、clone_with_children()
を書く方法です。 Rc
同じ内部の参照カウントを維持しながら
私は、Rc<Expression>
からRc<AstNode>
(または何を持っている)をダウンキャストする必要がありますが、私が見つけたダウンキャストライブラリのどれもがそれを行うことができるように思えません。
私は可能なのですか、それとも全く違うのですか?
:
さらに読書のための関連Q & A 'Self'(特性オブジェクトは値で' Self'を使うことはできません)、おそらく 'Rc'を返す必要があります。 –
'Expression'が' AstNode'特性を実装していない理由はありますか?それは動的ディスパッチが正しいことをさせるでしょうか? –
私はASTの操作はここで気を散らすと思います。本当に知りたいのは、 'Rc'を 'Rc