Downcast-Merkmale in Rc für die AST-Manipulation

Ich versuche ASTs in Rust zu manipulieren. Es wird viele Manipulationen geben, und ich möchte, dass meine Bäume unveränderlich sind. Um Zeit zu sparen, werden alle Referenzen @ seiRc s.

Meine Baumknoten sehen dann so aus:

enum Condition {
    Equals(Rc<Expression>, Rc<Expression>),
    LessThan(Rc<Expression>, Rc<Expression>),
    ...
}

enum Expression {
    Plus(Rc<Expression>, Rc<Expression>),
    ...
}

Ich möchte einen zufälligen Knoten eines bestimmten Typs durch einen anderen Knoten desselben Typs ersetzen. Um generische Operationen an Bäumen durchzuführen, habe ich eine Eigenschaft erstellt:

trait AstNode {
    fn children(&self) -> Vec<Rc<AstNode>>;
}

Und alle Knoten implementieren dies. Auf diese Weise kann ich den Baum durchgehen, ohne jeden Knotentyp für jede Operation zu zerstören, indem ich einfach @ aufrufchildren().

Ich möchte auch einen Knoten klonen, während nur eines seiner untergeordneten Elemente aktualisiert und die anderen an Ort und Stelle belassen werden. Angenommen, ich habe Knoten des richtigen konkreten Typs generiert (und bin froh, dass das Programm in Panik gerät, wenn ich falsch liege). Ich werde die folgende Methode zum Merkmal hinzufügen:

trait AstNode {
    fn clone_with_children(&self, new_children: Vec<Rc<AstNode>>) -> Self
        where Self: Sized;
}

Mein Plan ist es, die von @ zurückgegebenen Kinder mitzunehmechilden(), ersetze einen von ihnen und rufe @ clone_with_children(), um einen Knoten derselben Aufzählungsvariante zu erstellen, wobei jedoch ein Knoten ersetzt wird.

Mein Problem ist, wie man @ schreiclone_with_children().

Ich muss @ niederwerfRc<AstNode> zuRc<Expression> (oder was hast du), während der Nachzähler im @ bleiRc das gleiche, aber keine der heruntergekommenen Bibliotheken, die ich gefunden habe, scheint dazu in der Lage zu sein.

Ist was ich will möglich, oder soll ich es ganz anders machen?

Antworten auf die Frage(2)

Ihre Antwort auf die Frage