在Scala中重载CTOR的问题

mer*_*ley 0 constructor scala overloading

我在Scala中加载构造函数时遇到了问题.每次我尝试为过载的CTOR传递值时,我都会收到错误

Example: 
    var client : Client = Client(*variable type List[String]()*);

 Unspecified value parameter clientList.    
Run Code Online (Sandbox Code Playgroud)

我的目标是使用2种不同的数据类型创建对象.一个是NodeSeq,另一个是列表.从来没有.我是否过度加载了CTOR或者是否有更有效的方法来实现我的目标?

package api
import xml._

case class Client(clientNode: NodeSeq, clientList: List[String]) {

  def this(clientNode: NodeSeq) = this(clientNode, null)
  def this(clientList: List[String]) = this(null, clientList)

  var firstName: String
  var lastName: String
  var phone: String
  var street: String
  var city: String
  var state: String
  var zip: String
  var products = List[String]()
  var serviceOrders = List[String]()

  if (clientList == null) {
    firstName = (clientNode \\ "firstname").text
    lastName = (clientNode \\ "lastname").text
    phone = (clientNode \\ "phone").text
    street = (clientNode \\ "street").text
    city = (clientNode \\ "city").text
    state = (clientNode \\ "state").text
    zip = (clientNode \\ "zip").text

    (clientNode \\ "products").foreach(i => products = i.text :: products)

    (clientNode \\ "serviceOrders").foreach(i => serviceOrders = i.text :: serviceOrders)

  } else {
    firstName = clientList(0)
    lastName = clientList(1)
    phone = clientList(2)
    street = clientList(3)
    city = clientList(4)
    state = clientList(5)
    zip = clientList(6)
  }

  override def toString(): String = {
    return "Name : " + firstName + " " + lastName +
      "\nAddress : " +
      "\n\t" + street +
      "\n\t" + city + ", " + state + " " + zip
  }

}
Run Code Online (Sandbox Code Playgroud)

Rex*_*err 5

你没有发布工作代码; 你不能有未定义的变量.

无论如何,问题在于即使您重写了构造函数,也没有覆盖随播对象中的构建器.添加它,它将按您想要的方式工作:

object Client {
  def apply(clientNode: NodeSeq) = new Client(clientNode)
  def apply(clientList: List[String]) = new Client(clientList)
}
Run Code Online (Sandbox Code Playgroud)

(如果您正在使用REPL,请务必使用:paste与案例类一起输入此内容,以便添加到默认伴随对象而不是替换它).

但更深层次的问题是,这不是你应该解决问题的方式.您应该定义包含所需数据的特征:

trait ClientData {
  def firstName: String
  def lastName: String
  /* ... */
}
Run Code Online (Sandbox Code Playgroud)

并从中继承两次,每次解析一次:

class ClientFromList(cl: List[String]) extends ClientData {
  val firstName = cl.head
  . . .
}
Run Code Online (Sandbox Code Playgroud)

或者您可以将NodeSeq转换为列表并在那里解析它或其他各种事物.这样你就可以避免暴露一堆可能以后不会改变的变量.