我有这个案例类:
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)
问题是我必须将right
和operator
包裹在Option
中。以下内容允许您避免Option
包裹right
和operator
参数(有关详细信息,请参阅答案):
object MyCaseClass {
def apply(left: Long, right: Long, operator: Operator) = new MyCaseClass(left, Option(right), Option(operator))
}
答案 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("+"))