如何在构造函数中添加一些动作?

gre*_*man 8 constructor scala method-call

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

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

  moveNext();

  ...
Run Code Online (Sandbox Code Playgroud)

所以我想有一个带有单个参数的构造函数,并在这样的构造函数中调用方法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();
  }

  ...
Run Code Online (Sandbox Code Playgroud)

但现在我得到"iter = it"的错误:

错误:'this'预期但找到了标识符.

iter = it;

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

Phi*_*ppe 19

第一个问题是,你的定义had_nextvalue是抽象的:这些成员都没有右手边.

尝试改为:

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

这里,_表示"默认未初始化的值".例如,以下适用于我在控制台中:

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] = ...
Run Code Online (Sandbox Code Playgroud)

第二个问题("'this'expect ...")之所以出现是因为在Scala中,辅助构造函数必须始终将另一个构造函数作为它们的第一个语句.this()例如,你的构造函数可以从一开始.有关更多详细信息,请参见Scala编程中的第6.7节.


Car*_*lla 6

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

例如:

class greeting(name:String) { ... }
Run Code Online (Sandbox Code Playgroud)

您还可以定义默认构造函数,以不使用代码中的参数

class greeting { ... }
Run Code Online (Sandbox Code Playgroud)

然后你可以添加额外的构造函数.添加到类中的所有构造函数都需要调用另一个构造函数作为构造函数的第一个语句.如果省略,则会显示"此预期但已找到标识符".

我们来看一个例子:

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)       
    }
}
Run Code Online (Sandbox Code Playgroud)

在上面的代码中,新的classconstructor()不执行任何操作,因为空构造函数没有body.并且新的classconstructor(200)执行空构造函数+新的构造函数,您可以在其中添加额外的代码,例如调用moveNext()方法.在这种情况下,这个打印200到控制台.