3

私はRustが初めてで、学習プロセスの一環として、各ノードが子のベクトルとその親への参照を持つツリー構造を作成しようとしています。addChild()新しいノードの値 (i32今のところ s ) を取得し、それを子リストに追加し、それ自体への参照を親として渡す関数をノードに作成したいと考えています。Rust by Example のリンク リストの例に従って、親を . で参照しようとしていBox<>ます。私は親を変更し、それへの参照を渡しているため、借用チェッカーが参照を解除することを望んでいないため、行き詰まりました&mut self(以下のコードを参照)。

このことから、2 つの質問があります。

  1. ツリー構造で親への参照を保持する正しい方法は何ですか? CIでは、親への単純なポインターと、子の任意のコレクションを保持します。

  2. Rust で同じ関数内のオブジェクトへの参照を変更して渡すにはどうすればよいでしょうか?

以下は、私の enum と impl の完全なコードであり、それを渡さずに self を変更するための追加のテスト関数があります。


#[derive(Hash, Eq, PartialEq)]
enum Node {
    Elem {
        value: i32,
        parent: Box<Node>,
        children: Vec<Node>,
    },
    Nil,
}

impl Node {
    fn new(value: i32, parent: Box<Node>) -> Node {
        return Node::Elem {
            value: value,
            parent: parent,
            children: Vec::new(),
        };
    }

    // This function works fine
    fn setValue(&mut self, v: i32) {
        match self {
            &mut Node::Elem { ref mut value, .. } => *value = v,
            &mut Node::Nil => {}
        }
    }

    fn addChild(&mut self, value: i32) {
        match self {
            &mut Node::Elem { ref mut children, .. } => {
                (*children).push(Node::new(value, Box::new(*self)))
                // Produces E0507 (Cannot move out of borrowed context)
            } 
            &mut Node::Nil => println!("Failed to add children to empty node"),
        }
    }
}
4

0 に答える 0