6

首先,这是在 Scala 2.8 中,所以它应该在那里!=)

我正在研究 Lift 的 Javascript 对象,我想要以下内容:

case class JsVar(varName: String, andThen: String*) extends JsExp {
  // ...
  def -&(right: String) = copy(andThen=(right :: andThen.toList.reverse).reverse :_*)
}

不幸的是,我收到以下编译器错误:

[error] Lift/framework/web/webkit/src/main/scala/net/liftweb/http/js/JsCommands.scala:452: not found: value copy
[error]     def -&(right: String) = copy(andThen=(right :: andThen.toList.reverse).reverse :_*)
[error]

案例类有属性,所以应该有copy方法吧?

如果我尝试this.copy,我会得到几乎相同的错误:

[error] Lift/framework/web/webkit/src/main/scala/net/liftweb/http/js/JsCommands.scala:452: value copy is not a member of net.liftweb.http.js.JE.JsVar
[error]     def -&(right: String) = this.copy(andThen=(right :: andThen.toList.reverse).reverse :_*)
[error]

为什么会这样以及如何copy在我的案例类方法中使用?copy还是编译器在声明我的方法后添加的想法?

我应该这样做吗?

case class JsVar(varName: String, andThen: String*) extends JsExp {
  // ...
  def -&(right: String) = JsVar(varName, (right :: andThen.toList.reverse).reverse :_*)
}
4

1 回答 1

7

规范在这方面没有提及,但这实际上是意料之中的。该copy方法依赖于默认参数,重复参数(varargs)不允许使用默认参数:

不允许在具有重复参数的参数部分中定义任何默认参数。

(Scala 参考,第 4.6.2 节 - 重复参数)

scala> def f(xs: Int*) = xs
f: (xs: Int*)Int*

scala> def f(xs: Int* = List(1, 2, 3)) = xs
<console>:24: error: type mismatch;
 found   : List[Int]
 required: Int*
       def f(xs: Int* = List(1, 2, 3)) = xs
                            ^
<console>:24: error: a parameter section with a `*'-parameter is not allowed to have default arguments
       def f(xs: Int* = List(1, 2, 3)) = xs
           ^
于 2011-07-09T22:41:13.023 回答