Rust 打印一棵树&x2014;尝试访问字段,但未找到具有该名称的字段
我正在尝试编写我的第一个Rust程序。我想在屏幕上打印一个简单的树,但我无法访问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 仅仅因为节点的两个变体都有一个值字段,并不意味着您可以直接访问它。您可
值
属性,它说
错误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好吧,如果你愿意,我会记下他的答案。总之,两个答案都很有用。