【问题标题】:Modelling a type hierarchy for a DSL in Scala在 Scala 中为 DSL 建模类型层次结构
【发布时间】:2013-11-28 18:44:05
【问题描述】:

我正在尝试在 Scala 中为 DSL 建模。 (我对 Scala 很陌生,所以我可能会遗漏一些微不足道的东西,在这种情况下道歉)。 DSL 支持一个非常简单的类型系统,其中名为“Terms”的实体可以有一个类型,默认情况下扩展Object,或者可以扩展其他类型,这些类型最终会扩展另一种类型或Object

我正在尝试使用案例类在 Scala 中对这种类型层次结构进行建模:

case class TermType(name: String, superType: TermType)

但是,我希望能够支持“默认”情况(类型只是扩展“对象”的情况),而不必指定超类型,所以是这样的:

//the following does not work, just illustrating what I want to achieve
case class TermType(name: String, superType: TermType = new TermType("Object", ???))

不确定这是否是正确的方法。我希望避免放置空值或类似的东西。我不知道采用Option 的方式在某种程度上是否更好(如果它确实有效的话)。

最好的方法是什么?

【问题讨论】:

    标签: scala constructor default-value


    【解决方案1】:

    例如:

    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"))
    

    【讨论】:

    • 谢谢,第二种情况更简洁。是否有可能以某种方式默认为 TermType("Object") 而不是 None?但是 Object 的 superType 需要是 None 。
    • 根据您的建议,这样的事情是否有意义? case class TermType(name: String, superType: Option[TermType] = Some(TermType("Object", None)))
    • 我个人认为在层次结构中将默认设置无任何好处,但可能是您的应用程序需要在“复杂”叶节点上默认设置。如果您不完全满意,以后很容易更改,因此请选择一种方法并继续努力:)。
    • 谢谢。我只是想对我的 DSL 的任何 TermType 扩展 Object 的默认层次结构进行建模,无论它是否明确指定。 Object 显然没有任何超类型。
    猜你喜欢
    • 2017-09-25
    • 2017-01-24
    • 2019-07-05
    • 1970-01-01
    • 1970-01-01
    • 2017-04-18
    • 1970-01-01
    • 2020-03-18
    • 2011-05-06
    相关资源
    最近更新 更多