有关scala构造函数加载的后续信息

有关scala构造函数加载的后续信息,scala,constructor,overriding,case-class,Scala,Constructor,Overriding,Case Class,这是我想要的一个case类构造函数的后续问题,它在受限形式的输入上操作,因此重写而不是重载构造函数: 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 regula

这是我想要的一个case类构造函数的后续问题,它在受限形式的输入上操作,因此重写而不是重载构造函数:

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”。如何获得所需的行为?

不需要两个构造函数。只需在类中添加检查,它们将在构建时运行

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


}

不需要两个构造函数。只需在类中添加检查,它们将在构建时运行

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


}

require(!regex.toString.contains(“*”),“…”)是更惯用的参数测试。另外,不需要最后一个else。
require(!regex.toString.contains(“*”),“…”)是更惯用的参数测试。另外,最后一个else也不需要。