Scala案例类,不能覆盖构造函数参数

时间:2014-08-21 09:02:22

标签: scala constructor case-class

我有这个案例类:

 case class MyCaseClass(left:Long, right: Long = Option[Long], operator: Operator = Option[Operator]){

    def inRange(outer: Long) = outer >= left && outer <= right
  }

这是我尝试实例化它的方式:

val instance = MyCaseClass(leftValue)

但是我收到了编译错误:

  

未指定的值参数,运算符

这个错误是什么意思?我只想为一个案例类有两个构造函数:一个有三个参数,一个有一个参数。

这有效(正如Ende Neu建议的那样):

case class MyCaseClass(left:Long, right: Option[Long] = None, operator: Option[Operator] = None)

问题是我必须将rightoperator包裹在Option中。以下内容允许您避免Option包裹rightoperator参数(有关详细信息,请参阅答案):

object MyCaseClass {
  def apply(left: Long, right: Long, operator: Operator) = new MyCaseClass(left, Option(right), Option(operator))
}

1 个答案:

答案 0 :(得分:4)

您没有传递默认值,传递类型,如果要传递默认参数,则必须指定一些值:

scala>  case class Operator(operation: String)
defined class Operator

scala>   case class MyCaseClass(left:Long, right: Long = 0L, operator: Operator = Operator("+")){
      |     def inRange(outer: Long) = outer >= left && outer <= right
      |   }
defined class MyCaseClass

scala>   val instance = MyCaseClass(10L)
instance: MyCaseClass = MyCaseClass(10,0,Operator(+))

如果你想将它们包装在Option中,你必须这样声明:

 case class MyCaseClass(left:Long, right: Option[Long] = None, operator: Option[Operator] = None)

我使用None作为值时,您也可以使用Some并将一些默认值传递给它们。

如果您不希望用户使用选项创建完整对象,请创建一个伴随对象并定义一个新的apply方法:

case class Operator(operation: String)

object MyCaseClass {
  def apply(left: Long, right: Long, operator: Operator) = new MyCaseClass(left, Option(right), Option(operator))
}

case class MyCaseClass(left:Long, right: Option[Long] = None, operator: Option[Operator] = None)

现在可以用不同的方式构造一个对象:

MycaseClass(10L)
MycaseClass(10L, Option(10L), Option(Operator("+"))
MycaseClass(10L, 20L, Operator("+"))