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

时间:2018-09-20 23:11:11

标签: rust

我试图在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 };

如果我进行模式匹配,是否会认为DogAnimal类型(还是Thing类型)?如何使用枚举和结构创建此类型层次结构?我的类型层次结构有很多层次。

2 个答案:

答案 0 :(得分:6)

当您看这段代码时:

enum Thing {
    Animal,
    Plant,
}

struct Plant {
    color: String,
}

您两次看到单词Plant。需要注意的重要一点是这两个Plant是不同的,无关的东西。仅仅因为它们具有相同的名称并不意味着它们代表相同的事物,实际上它们当您使用完全限定名称时,实际上并没有相同的名称:第一个是::Thing::Plant,第二个只是普通的::Plant

如果要链接两者,则需要使用以下命令使其明确:

enum Thing {
    Animal(Animal),
    Plant(Plant),
}

有关更多详细信息,请参见the Rust book中的IpAddr示例。

答案 1 :(得分:3)

即使在显式支持继承的语言中,“很多深度”通常也不是一个好主意。

如果要将某些代码移植到Rust,则可能需要考虑通过引入更自然的概念(例如traits, generic typesclosures等)来改进设计。