Отсутствующие члены из аргументов конструктора по умолчанию - PullRequest
2 голосов
/ 19 октября 2010

В следующем классе есть вспомогательный конструктор для неизменного изменения одного свойства.

class AccUnit(size: Long, start: Date, direction:Direction, protocol:String) {
    def this(size:Long, that:AccUnit) {this(size, that.start, that.direction, that.protocol)}
}

Компилятор возвращает ошибки:

AccUnit.scala:26: error: value start is not a member of trafacct.AccUnit
        def this(size:Long, that:AccUnit) {this(size, that.start, that.direction, that.protocol)}
                                                           ^
AccUnit.scala:26: error: value direction is not a member of trafacct.AccUnit
        def this(size:Long, that:AccUnit) {this(size, that.start, that.direction, that.protocol)}
                                                                       ^
AccUnit.scala:26: error: value protocol is not a member of trafacct.AccUnit
        def this(size:Long, that:AccUnit) {this(size, that.start, that.direction, that.protocol)}

Почему он считает, что неттакие члены?

Ответы [ 2 ]

7 голосов
/ 19 октября 2010

Потому что должно быть

class AccUnit(val size: Long, val start: Date, val direction:Direction, val protocol:String) {...}

или

case class AccUnit(size: Long, start: Date, direction:Direction, protocol:String) {...}

В вашей версии size и другие являются только аргументами конструктора, но не членами.

ОБНОВЛЕНИЕ: Вы можете проверить это сами:

// Main.scala
class AccUnit(size: Long, protocol: String)

F:\MyProgramming\raw>scalac Main.scala

F:\MyProgramming\raw>javap -private AccUnit
Compiled from "Main.scala"
public class AccUnit extends java.lang.Object implements scala.ScalaObject{
    public AccUnit(long, java.lang.String);
}
6 голосов
/ 19 октября 2010

Если вы используете Scala 2.8, то лучшим решением будет использование метода копирования, определенного в классах наблюдений, который использует преимущества именованных параметров / параметров по умолчанию:

case class AccUnit(size: Long, start: Date, direction:Direction, protocol:String)

val first = AccUnit(...)
val second = first.copy(size = 27L)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...