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添加。