2013-08-23 16 views
5

Diciamo che avere il seguente codice nel xTend:xTend: come interrompere una variabile dalla stampa in uscita?

class StackOverflowGenerator { 
    def generate()''' 
    «var counter = 0» 
    «FOR i : 0 ..<10» 
    Line Numnber: «i» 
    «counter = counter + 1» 
    «ENDFOR» 
''' 

} 

Questo genererà in uscita nel formato:

Line Numnber: 0 
    1 
    Line Numnber: 1 
    2 
    Line Numnber: 2 
    3 
    Line Numnber: 3 
    ... 

Come faccio ad avere xTend per non stampare la linea con solo il contatore e solo stampare la riga numero di riga in modo tale che l'output assomiglia:

Line Numnber: 0 
Line Numnber: 1 
Line Numnber: 2 
Line Numnber: 3 
... 
+1

Qual è lo scopo della variabile 'contatore'? Perché non usare solo io? – ZhekaKozlov

risposta

3

Nel tuo esempio non è possibile utilizzare counter. Quindi è difficile indovinare qual è il tuo vero caso d'uso. Nella maggior parte dei casi alcuni calcoli basati su i sono sufficienti, eliminando completamente counter. La risposta di Orionll sta puntando in quella direzione.

Se invece counter è qualcosa che non può essere calcolata dalla i ma è uno stato accumulato, quindi la cosa più semplice è quello di estrarre quello stato in una classe personalizzata e per modificare questo stato utilizzando void metodi. In questo esempio viene utilizzato il metodo void setCounter(int) generato.

class Example { 
    def static void main(String[] args) { 
     println(generate) 
    } 

    def static generate() ''' 
     «var state = new State(0)» 
     «FOR i : 0 ..< 10» 
      Line Numnber: «i» 
      «state.setCounter(state.counter + 1)» 
     «ENDFOR» 
    ''' 

} 

class State { 
    @Property 
    var int counter 

    new(int counter){ 
     this.counter = counter 
    } 
} 
1
«var counter = 0» 
«FOR i : 0 ..<10» 
Line Number: «counter = i» 
«ENDFOR» 
+0

Approccio gradevole e pulito. – Vivit

7

In Xtend, everything is an expression, così «counter = counter + 1» restituisce il risultato della cessione, è per questo che sarà parte della stringa. Pertanto, se si desidera eseguire effettivamente un effetto collaterale in un ciclo di espressione di un modello (che è fortemente sconsigliato), eseguirlo in un'espressione di blocco e restituire la stringa vuota o null: «{ counter = counter + 1; "" }». Tuttavia, questo non è troppo elegante, quindi potresti volere risolvere il tuo problema in un altro modo, come suggeriscono le altre risposte.

+0

Strano comunque, se devo pensare a sopprimere un comportamento che da un punto di vista più tecnico potrebbe essere considerato un effetto collaterale (anche in questo caso l'effetto collaterale è di design in questo caso). – JensG