2010-10-19 4 views
2

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

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)} 

Почему думает, что нет таких членов?

+0

Связанные http://stackoverflow.com/q/2400794/203968 – oluies

+0

Связанные http://stackoverflow.com/q/3900307/203968 – oluies

ответ

7

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

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 и другие только аргументы конструктора, но не члены.

UPDATE: Вы можете проверить это сами:

// 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); 
} 
+0

Последнее предложение неправильно, я думаю, что они являются членами но они частные. Скала> Класс AccUnit (размер: Long, старт: дата, направление: направление, протокол: String) {переопределения четкости ToString = "размер:" + размер + "начало:" + начать} Скала> новый AccUnit (1, новая дата(), новое направление(), «тест») res2: AccUnit = размер: 1, начало: Вт 19 окт 20:37:44 CEST 2010 – oluies

+0

Они становятся членами автоматически, если они используются в теле класса –

+0

Хмм, WFT ... AHA ... есть ли у вас какие-либо ссылки на doc? Глава 6.5 в «Программирование в Scala» – oluies

6

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

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

val first = AccUnit(...) 
val second = first.copy(size = 27L) 
Смежные вопросы