0

これはScalaコンストラクターのオーバーロードに対するフォローアップの質問ですか?コンストラクターをオーバーロードするのではなく、制限された形式の入力で動作し、オーバーライドするケースクラスコンストラクターが必要です。

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」が見つかりました。どうすれば私が望む振る舞いを得ることができますか?

4

1 に答える 1

5

2 つのコンストラクターは必要ありません。クラス内にチェックを追加するだけで、構築時に実行されます。

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


}
于 2012-12-11T08:23:17.073 に答える