我正在尝试在Scala中建模DSL。 (我对Scala很新,所以我可能会遗漏一些微不足道的东西,在这种情况下道歉)。
DSL支持一个非常简单的类型系统,其中称为“术语”的实体可以有一个类型,默认情况下扩展Object
,或者可以扩展其他类型,这些类型本身最终会扩展另一个类型或{{1 }}。
我正在尝试使用案例类在Scala中建模此类型层次结构:
Object
但是,我希望能够支持'默认'情况(类型只扩展'Object'的情况),而不必指定超类型,所以有类似的东西:
case class TermType(name: String, superType: TermType)
不确定这是否是正确的做法。我希望避免使用null或类似的东西。我不知道//the following does not work, just illustrating what I want to achieve
case class TermType(name: String, superType: TermType = new TermType("Object", ???))
方式是否在某种程度上更好(如果它有效)。
最好怎么做呢?
答案 0 :(得分:3)
例如:
sealed abstract class TermType
case class TermTypeSimple(name: String) extends TermType
case class TermTypeWithParen(name: String, parent: TermType) extends TermType
其他方式:
case class TermType(name: String, superType: Option[TermType] = None)
用法:
TermType("Hi")
TermType("Buy", Some(TermType("Beer"))