我试图在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
类型)?如何使用枚举和结构创建此类型层次结构?我的类型层次结构有很多层次。
答案 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 types,closures等)来改进设计。