如果用户不提供 name 参数,我试图提供一个合理的默认值。在 Eclipse IDE 的 Scala 工作表中执行以下操作会生成编译器错误:
case class Type(id: Int, name: String, description: String = "")
case class Definition(id: Int, types: List[Type], separator: String = ";", name: String = types.mkString(separator))
错误是“未找到:值分隔符”,在用于 List 的 mkString 方法调用内的标识符“分隔符”上指示。既然这是一个案例类,而且前面的参数已经定义好了,为什么我不能使用“分隔符”来定义名称的默认值。事实证明,我什至不能使用“类型”来定义“名称”的默认值。
我试图解决这个问题,但是如果不将 name 转换为 var,我不知道该怎么做,这不是我想做的事情。对此的任何指导或理解表示赞赏。
更新:好的,我发现解决这个问题的方法是使用伴随对象转发到构造函数:
case class Type(id: Int, name: String, description: String = "")
object Definition {
def create(id: Int, types: List[Type], separator: String = ";", name: String = "") =
Definition(id, types, separator, if (name != "") name else types.map(_.name).mkString(separator))
}
case class Definition(id: Int, types: List[Type], separator: String = ";", name: String) {
require(!separator.isEmpty, "separator must not be empty")
require(!name.isEmpty, "name must not be empty")
}
与我最初尝试做的相比,这肯定是相当多的类似 Java 的样板。有没有其他/更好的方法来做到这一点?