Как добавить некоторые действия в конструктор? - PullRequest
8 голосов
/ 12 октября 2011

Наивный вопрос, я верю, но все, что я нахожу, это просто вызов других конструкторов из конструкторов. Мне нужно вызвать метод. Мой класс (начало):

class ScopedIterator[T](val iter : Iterator[T])
{
  private var had_next : Boolean;
  private var value : T;

  moveNext();

  ...

поэтому я хотел бы иметь конструктор с одним аргументом, и в таком конструкторе вызвать метод moveNext. Вот и все.

Когда я компилирую код, я получаю сообщение об ошибке:

ошибка: абстрактный член может не иметь приватного модификатора

private var had_next: Boolean;

и то же самое для значение .

Я изменил это на:

class ScopedIterator[T]
{
  private var had_next : Boolean;
  private var value : T;
  private var iter : Iterator[T];

  def this(it : Iterator[T]) =
  {
    iter = it;
    moveNext();
  }

  ...

Но теперь я получаю сообщение об ошибке "iter = it":

ошибка: ожидается "это", но идентификатор найден.

iter = it;

Как написать такой конструктор в Scala?

Ответы [ 2 ]

19 голосов
/ 12 октября 2011

Первая проблема заключается в том, что ваши определения had_next и value абстрактны: у этих членов нет правой части.

Попробуйте вместо:

class ScopedIterator[T](val iter : Iterator[T]) {
  private var had_next : Boolean = _
  private var value : T = _
  ...
}

Здесь _ означает «неинициализированное значение по умолчанию».Например, для меня в консоли работает следующее:

class ScopedIterator[T](val iter : Iterator[T]) {
  private var had_next : Boolean = _
  private var value : T = _

  init()

  def init() : Unit = { println("init !") }
}

scala> new ScopedIterator(List(1,2,3).toIterator)
init !
resN: ScopedIterator[Int] = ...

Вторая проблема («это« ожидается ... ») возникает потому, что в Scala вспомогательные конструкторы всегда должнывызовите другого конструктора в качестве первого утверждения.Например, ваш конструктор может начинаться с this().Для получения более подробной информации см. Раздел 6.7 в Программирование в Scala .

6 голосов
/ 12 октября 2011

Конструктор по умолчанию - это тот, который вы определяете при объявлении вашего класса

Пример:

class greeting(name:String) { ... }

Вы также можете определить конструктор по умолчанию, который не принимает параметры, как в вашем коде

class greeting { ... }

Затем вы можете добавить дополнительные конструкторы.Все конструкторы, которые вы добавляете в класс, должны вызывать другой конструктор как первый оператор конструктора.Если вы пропустите это, вы получите «этот ожидаемый, но идентификатор найден».

Давайте рассмотрим пример:

class classconstructor {
    var iter:Int = 0    
    def this(it:Int) = {      
      this()
      iter = it;
      moveNext();
    }   
    def moveNext() = {
      println(iter)   
    }
}

object App
{
    def main(args:Array[String])
    {
        val x = new classconstructor()
        val y = new classconstructor(200)       
    }
}

В приведенном выше коде новый classconstructor () ничего не делает, потому что пустой конструктор нене имеет тела.и new classconstructor (200) выполняет пустой конструктор + новый, куда вы можете добавить дополнительный код, такой как вызов метода moveNext ().В этом случае этот выводит 200 на консоль.

...