Rust 打印一棵树&x2014;尝试访问字段,但未找到具有该名称的字段

Rust 打印一棵树&x2014;尝试访问字段,但未找到具有该名称的字段,rust,imperative-programming,imperative-languages,Rust,Imperative Programming,Imperative Languages,我正在尝试编写我的第一个Rust程序。我想在屏幕上打印一个简单的树,但我无法访问值属性,它说 错误1尝试访问类型节点上的字段值,但没有字段 找到了具有该名称的c:\users\zhukovskiy\documents\visual studio 2013\Projects\rust\u application1\rust\u application1\src\main.rs 21 20 rust\u application1 仅仅因为节点的两个变体都有一个值字段,并不意味着您可以直接访问它。您可

我正在尝试编写我的第一个Rust程序。我想在屏幕上打印一个简单的树,但我无法访问
属性,它说

错误1尝试访问类型
节点
上的字段
,但没有字段 找到了具有该名称的c:\users\zhukovskiy\documents\visual studio 2013\Projects\rust\u application1\rust\u application1\src\main.rs 21 20 rust\u application1


仅仅因为
节点
的两个变体都有一个
字段,并不意味着您可以直接访问它。您可以通过匹配值来获得它(这些值是等效的):

但是,如果要经常这样做,您可能需要添加一个方法:

impl Node {
    pub fn get_value(&self) -> i32 {
        match self {
            &Node::Branch { value, .. } => value,
            &Node::Leaf { value } => value,
        }
    }
}
…然后您可以这样使用:

let value = leaf.get_value();

仅仅因为
节点
的两个变体都有一个
字段,并不意味着您可以直接访问它。您可以通过匹配值来获得它(这些值是等效的):

但是,如果要经常这样做,您可能需要添加一个方法:

impl Node {
    pub fn get_value(&self) -> i32 {
        match self {
            &Node::Branch { value, .. } => value,
            &Node::Leaf { value } => value,
        }
    }
}
…然后您可以这样使用:

let value = leaf.get_value();

用我直觉的魔力,我猜你有这样的代码:

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);
                            ^~~~~~~~~~

用我直觉的魔力,我猜你有这样的代码:

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);
                            ^~~~~~~~~~

由于所有枚举变量都具有相同的字段,因此可以将字段提取到外部结构中,并且只保留枚举内部不同的字段。这样,您就可以直接访问内部
字段。当您想确定您的节点是分支还是叶子时,您需要在类字段中进行匹配。此外,我建议使用
Rc
而不是
*const节点
,因为访问
*const节点
指向的值需要不安全的代码,并且很可能会在更复杂的代码中给您带来麻烦

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) };
}

我认为您实际需要的是以下代码:

由于所有枚举变量都具有相同的字段,因此可以将字段提取到外部结构中,并且只保留枚举内部不同的字段。这样,您就可以直接访问内部
字段。当您想确定您的节点是分支还是叶子时,您需要在类字段中进行匹配。此外,我建议使用
Rc
而不是
*const节点
,因为访问
*const节点
指向的值需要不安全的代码,并且很可能会在更复杂的代码中给您带来麻烦

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) };
}

我认为您实际上需要的是以下代码:

@Shepmaster是的,它可以工作,但我无法遍历树。我编辑以演示一个想法。它不起作用,但显示出我想得到什么。但我认为ket的回答允许我这么做。我认为我的回答不再回答你的问题了。这可能是你想要的一件事,也可能是你问题的解决方案。但是你的问题的答案是@DK。您应该匹配枚举内容,而不仅仅是names@ker好吧,如果你愿意,我会记下他的答案。不管怎样,这两个答案都非常有用。@Shepmaster是的,它有效,但我无法遍历树。我编辑以演示一个想法。它不起作用,但显示出我想得到什么。但我认为ket的回答允许我这么做。我认为我的回答不再回答你的问题了。这可能是你想要的一件事,也可能是你问题的解决方案。但是你的问题的答案是@DK。您应该匹配枚举内容,而不仅仅是names@ker好吧,如果你愿意,我会记下他的答案。总之,两个答案都很有用。