10

我相信天真的问题,但我发现的只是从构造函数中调用其他构造函数。我需要调用一个方法。我的课(开始):

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

  moveNext();
  
  ...

所以我想要一个带有单个参数的构造函数,并在这样的构造函数中调用一个方法 moveNext。就这样。

当我编译代码时出现错误:

错误:抽象成员可能没有私有修饰符

private var had_next : 布尔值;

value一样。

我将其更改为:

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”上遇到错误:

错误:预期为“this”,但找到了标识符。

迭代器 = 它;

如何在 Scala 中编写这样的构造函数?

4

2 回答 2

23

第一个问题是您对had_nextand的定义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] = ...

第二个问题(“'this' expected...”)的出现是因为在 Scala 中,辅助构造函数必须始终调用另一个构造函数作为它们的第一条语句。例如,您的构造函数可以以 开头this()有关更多详细信息,请参阅Scala 编程中的第 6.7 节。

于 2011-10-12T12:36:29.103 回答
6

默认构造函数是您在声明类时定义的构造函数

前任:

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

在上面的代码中, new classconstructor() 什么都不做,因为空的构造函数没有主体。并且 new classconstructor(200) 执行空构造函数 + 新的构造函数,您可以在其中添加额外代码,例如调用 moveNext() 方法。在这种情况下,这个打印 200 到控制台。

于 2011-10-12T12:11:04.117 回答