1

私は最初の Rust プログラムを書こうとしています。画面に単純なツリーを印刷したいのですが、valueプロパティにアクセスできません。

エラー 1 はvaluetype のフィールドにアクセスしようNodeとしましたが、その名前のフィールドが見つかりませんでした c:\users\zhukovskiy\documents\visual studio 2013\Projects\rust_application1\rust_application1\src\main.rs 21 20 rust_application1

use std::io;

enum Node {
    Branch { value: i32, next: *const Node },
    Leaf { value: i32 }
}

fn main() {
    let leaf = Node::Leaf { value: 15 };
    let branch = Node::Branch { value: 10, next: &leaf };
    let root = Node::Branch { value: 50, next: &branch };

    let current = root;
    loop {
        match current {
            Node::Branch => { println!("{}", current.value); current = current.next; },
            Node::Leaf => { println!("{}", current.value); break; }, 
        }
    }
}
4

3 に答える 3

2

すべての列挙バリアントには同じフィールドがあるため、フィールドを外側の構造体に抽出し、列挙内で異なるフィールドのみを保持できます。このようにして、内部valueフィールドに直接アクセスできます。Branchノードがかかを調べたい場合はLeaf、フィールドで一致させる必要がありkindます。また、 のRc<Node>代わりにを使用することをお勧めします。これは、 が指す*const Node値にアクセスする*const Nodeには安全でないコードが必要であり、より複雑なコードでは問題が発生する可能性が高いためです。

enum NodeKind {
    Branch(*const Node),
    Leaf,
}

use NodeKind::*;

struct Node {
    value: i32,
    kind: NodeKind,
}

fn main() {
    let leaf = Node{ value: 15, kind: Leaf };
    let branch = Node { value: 10, kind: Branch(&leaf) };
    let root = Node { value: 50, kind: Branch(&branch) };
}

実際に必要なのは次のコードだと思います: PlayPen

于 2015-05-18T14:58:12.187 に答える
1

私の直感の魔法の力を使用すると、次のようなコードがあると思います。

enum Node {
    Branch { value: i32 },
    Leaf { value: i32 },
}

fn main() {
    let leaf = Node::Leaf { value: 15 };

    println!("{}", leaf.value);
}

実際にエラーがあるのは次のとおりです。

<anon>:9:20: 9:30 error: attempted access of field `value` on type `Node`, but no field with that name was found
<anon>:9     println!("{}", leaf.value);
                            ^~~~~~~~~~

問題は、 の型が でleafありNodeNode2 つのバリアントBranchまたはがあることLeafです。Node::Branchorという型はありませんNode::Leaf。すべてのケースを徹底的に処理するには、列挙を一致させる必要があります。

enum Node {
    Branch { value: i32 },
    Leaf { value: i32 },
}

fn main() {
    let leaf = Node::Leaf { value: 15 };

    match leaf {
        Node::Branch { value } => println!("Branch [{}]", value),
        Node::Leaf { value }   => println!("Leaf [{}]", value),
    }
}
于 2015-05-18T14:43:16.020 に答える