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)
你没有发布工作代码; 你不能有未定义的变量.
无论如何,问题在于即使您重写了构造函数,也没有覆盖随播对象中的构建器.添加它,它将按您想要的方式工作:
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转换为列表并在那里解析它或其他各种事物.这样你就可以避免暴露一堆可能以后不会改变的变量.