2011-10-12 20 views
7

Domanda ingenua Credo, ma tutto quello che trovo è solo chiamare altri costruttori dai costruttori. Devo chiamare un metodo. La mia classe (inizio):Come aggiungere qualche azione nel costruttore?

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

    moveNext(); 

    ... 

quindi mi piacerebbe avere un costruttore con singolo argomento, e in tale costruttore di chiamare un metodo MoveNext. È tutto.

Quando compilo il codice ottengo errore:

error: abstract member may not have private modifier

private var had_next : Boolean;

e lo stesso per valore.

ho cambiato in:

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

    ... 

Ma ora ho errore "iter = it":

error: 'this' expected but identifier found.

iter = it;

come scrivere come costruttore a Scala?

+0

In particolare, quale errore si ottiene su iter = it'? – asm

+0

@Andrew Myers, mi dispiace, aggiornato. – greenoldman

risposta

18

Il primo problema è che le definizioni di had_next e value sono astratti: questi membri non hanno alcun lato destro.

Prova invece:

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

Qui, _ significa "default valore non inizializzato". Ad esempio, i seguenti lavori per me nella console:

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] = ... 

Il secondo problema (" 'questo' previsto ...") deriva dal fatto che in Scala, costruttori ausiliari devono sempre chiamare un altro costruttore come la loro prima dichiarazione. Quindi il tuo costruttore potrebbe iniziare con this(), per esempio. Per ulteriori dettagli, vedere la Sezione 6.7 in Programming in Scala.

+0

Grazie, non mi aspettavo che dovessi chiamare anche sintetizzato " costruttore". – greenoldman

6

Il costruttore di default è quella che si definisce quando si dichiara la classe

Es:

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

È possibile anche definire il costruttore di default di prendere alcun parametro, come nel codice

class greeting { ... } 

Quindi è possibile aggiungere costruttori aggiuntivi. Tutti i costruttori aggiunti alla classe devono chiamare un altro costruttore come prima istruzione del costruttore. Se ometti di ottenere "questo atteso ma identificatore trovato".

Vediamo un esempio:

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

Nel codice precedente nuovo classConstructor() fa nulla poiché il costruttore vuoto non ha corpo. e nuovo classconstructor (200) esegue il costruttore vuoto + il nuovo in cui è possibile aggiungere codice aggiuntivo come una chiamata al metodo moveNext(). In questo caso, questo stampa 200 sulla console.

+0

Entrambe le risposte sono eccezionali e coprono tutti i problemi. Comunque posso segnare come UNA risposta solo una :-(Spero non ti dispiaccia, sono comunque grato – greenoldman

+0

Prego.Non preoccupa –