2013-11-15 53 views
2

我正在嘗試在Scala中建模DSL。 (我對Scala非常陌生,所以我可能會錯過一些微不足道的東西,在這種情況下,我會道歉)。 DSL支持一個非常簡單的類型系統,其中實體名稱爲「條款」的實體可以有一個類型,默認情況下可以擴展Object,或者可以擴展其他類型,這些類型最終可以擴展爲其他類型或Object在Scala中建模DSL的類型層次結構

我想使用的情況下,類在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的方式是否更好一些(如果它工作的話)。

最好的方法是什麼?

回答

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

感謝,第二種情況是乾淨多了。是否有可能以某種方式使TermType(「Object」)失效而不是None?但是Object的superType需要是None。 – jbx

+0

根據你的建議,這樣做是否有意義? 'case class TermType(name:String,superType:Option [TermType] = Some(TermType(「Object」,None)))' – jbx

+0

我個人認爲在默認情況下沒有任何好處沒有更進一步的層次結構,但可能是你的應用程序需要在「複雜」葉節點上默認。如果你不能完全滿意,以後再改變會很容易,所以選擇一種方法並在其上工作:)。 –