10

素朴な質問だと思いますが、私が見つけたのは、コンストラクターから他のコンストラクターを呼び出すことだけです。メソッドを呼び出す必要があります。私のクラス(始まり):

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

  moveNext();
  
  ...

したがって、単一の引数を持つコンストラクターが必要であり、そのようなコンストラクターでメソッドmoveNextを呼び出します。それで全部です。

コードをコンパイルすると、エラーが発生します。

エラー:抽象メンバーにプライベート修飾子がない可能性があります

private var had_next:ブール値;

についても同じです。

私はそれを次のように変更しました:

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'が必要ですが、識別子が見つかりました。

iter = it;

Scalaでそのようなコンストラクターを書く方法は?

4

2 に答える 2

23

最初の問題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] = ...

2番目の問題( "'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()は何もしません。新しいclassconstructor(200)は、空のコンストラクターと、moveNext()メソッドの呼び出しなどのコードを追加できる新しいコンストラクターを実行します。この場合、これはコンソールに200を出力します。

于 2011-10-12T12:11:04.117 に答える