Почему компилятор Scala говорит, что копия не является членом моего класса case? - PullRequest
5 голосов
/ 09 июля 2011

Во-первых, это в 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]

Класс case имеет свойства, поэтому должен быть метод 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 в моем методе класса case? Или идея, что copy - это то, что компилятор добавляет после объявления моих методов?

Должен ли я просто сделать это?

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

1 Ответ

7 голосов
/ 10 июля 2011

В спецификации ничего не говорится об этом, но на самом деле это ожидаемо.Метод 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
           ^
...