Scala 二级建造师不是;精选;由编译器
对于具有二级构造函数且第二个构造函数上没有默认参数的以下类:Scala 二级建造师不是;精选;由编译器,scala,Scala,对于具有二级构造函数且第二个构造函数上没有默认参数的以下类: case class ExecParams(tag: String, process: String, args: Option[Seq[String]] = None, env: Option[Seq[String]] = None, dir: String = ".") { def this(tag: String, cmdLine: String, dir: String, env: Option[Seq[Strin
case class ExecParams(tag: String, process: String, args: Option[Seq[String]] = None,
env: Option[Seq[String]] = None, dir: String = ".") {
def this(tag: String, cmdLine: String, dir: String, env: Option[Seq[String]]) = this(tag, cmdLine.split(" ").apply(0),
Option(cmdLine.split(" ").tail), if (env.isEmpty) None else env, dir)
override def toString: String = process + " " + args.flatMap(arr => Some(arr.mkString(" "," ",""))).getOrElse("")
}
编译器显然将以下用于调用辅助参数的代码应用于主参数:
ExecParams("tag", "cmd", "dir", None)
编译器错误为:
<console>:14: error: type mismatch;
found : String("dir")
required: Option[Seq[String]]
ExecParams("tag", "cmd", "dir", None)
^
:14:错误:类型不匹配;
找到:字符串(“dir”)
必需:选项[序号[字符串]]
ExecParams(“标记”、“命令”、“目录”、无)
^
为什么选择的是主构造器而不是次构造器?@LuisMiguelMejiaSuarez在评论中给出了答案,并邀请他创建一个真实的答案。与此同时,它是:
ExecParams("tag", "cmd", "dir", None)
不是调用构造函数,而是调用伴随对象上的apply
方法(随后将调用构造函数)。您可以尝试以下方法:
new ExecParams("tag", "cmd", "dir", None)
而是调用构造函数。或者创建调用辅助构造函数的辅助应用程序
另一种方法是将apply()
添加到直接调用辅助构造函数的伴随对象,例如
object ExecParams {
def apply(tag: String, cmdLine: String, dir: String,
env: Option[Seq[String]]) =
new ExecParams(tag, cmdLine, dir, env)
这:
ExecParams(“tag”、“cmd”、“dir”、None)
不是在调用构造函数,而是在调用伴生对象上的apply
方法(随后将调用构造函数)。您可以尝试使用:newexecparams(“tag”、“cmd”、“dir”、None)
来调用构造函数。或者创建一个调用二级构造函数的二级apply
。@LuisMiguelMejíaSuárez请回答这个问题。可能还值得一提的是如何将apply
添加到伴随对象中,以便初始语法起作用。@ethan ok添加。