如何使用Rust枚举定义类型层次结构?

4

我正在尝试用Rust编写一个编译器,但是我在理解如何使用枚举定义类型层次结构方面遇到了问题。例如,我们有:

enum Thing {
    Animal,
    Plant,
}

struct Plant {
    color: String,
}

enum Animal {
    Dog,
    Cat,
}

struct Cat {
    name: String,
}

struct Dog {
    name: String,
}

let x = Dog { name: john };

如果我进行模式匹配,Dog 是否会被视为 Animal 类型(或 Thing 类型)?如何使用枚举和结构体创建此类型层次结构?我的类型层次结构具有多个深度级别。

就目前而言,您的类型彼此完全独立。此外,Rust不支持继承的概念。如果您想要一些子类型的概念,我建议您考虑使用traits。 - squiguy
你可能会发现 https://users.rust-lang.org/t/how-to-do-c-like-inheritance/20545 非常有趣。 - hellow
1个回答

7

当您查看这段代码时:

enum Thing {
    Animal,
    Plant,
}

struct Plant {
    color: String,
}

你会看到两次出现了单词Plant。需要注意的是,这两个Plant是不同的、不相关的事物。仅仅因为它们有相同的名称,并不意味着它们代表同一件事情,实际上当你考虑完全限定名称时,它们并没有相同的名称:第一个是::Thing::Plant,而第二个则只是普通的::Plant
如果您想将它们链接起来,您需要使用以下方式明确表示:
enum Thing {
    Animal(Animal),
    Plant(Plant),
}

如需更多细节,您可以查看Rust书中的IpAddr示例。


1
这很接近,但并没有直接回答楼主的问题。 - Shepmaster
1
@Shepmaster OP 问道:“我该如何使用枚举和结构体创建这种类型层次结构?” 这是一种解决方式。 - Jmb

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接