2012-12-11 55 views
0

这是一个后续问题要Scala constructor overload?我想的是,输入等覆盖的限制形式运行的情况下类的构造函数,而不是重载的构造器:随访约斯卡拉构造oveloading

abstract class Expr 

case class RegExpr(regex : Regex) extends Expr { 
    override def this(regex : Regex) = { 
    if (regex.toString contains "*") 
    throw new Exception("Restricted class of regular expressions: cannot contain Kleene star.") 
    else if (regex.toString contains "|") 
     throw new Exception("Restricted class of regular expressions: cannot contain disjunction.") 
    else this(regex) 
    } 
} 

这不编译;我已经尝试了几次不同的迭代,但他们都回到编译器告诉我它期望'this',但是'if'被找到。我如何得到我想要的行为?

回答

5

不需要两个构造函数。只需在班级内添加支票,他们将在施工时间运行。

case class RegExpr(regex: Regex) extends Expr { 
    if (regex.toString contains "*") throw ... 
    if (regex.toString contains "|") throw ... 


} 
+0

太好了,谢谢!这似乎改善了事情。 – etosch

+3

'require(!regex.toString.contains(“*”),“...”)'是更惯用的参数测试。 – senia

+0

此外,最后的其他是不必要的。 – yakshaver