2013-08-23 4 views
5

Powiedzmy, że masz następujący kod w Xtend:xTend: Jak zatrzymać zmienną przed drukowaniem na wydruku?

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

} 

To będzie generować wyjście w formacie:

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

Jak mogę Xtend aby nie drukować linię tylko z licznika i jedyny drukować linię osi liczbowej tak, że wyjście wygląda następująco:

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

Jaki jest cel zmiennej "licznikowej"? Dlaczego po prostu nie używać i? – ZhekaKozlov

Odpowiedz

3

W twoim przykładzie nie ma zastosowania dla counter. Trudno więc zgadnąć, jaki jest twój prawdziwy użytek. W większości przypadków wystarczy obliczenie oparte na i, całkowicie eliminując counter. Odpowiedź Orionlla wskazuje w tym kierunku.

Jeśli jednak counter jest coś, co nie może być obliczona z i ale jest trochę nagromadzonego stanu, a następnie najprostszą rzeczą jest, aby wyodrębnić ten stan w niestandardowej klasy i zmodyfikować ten stan za pomocą void metod. W tym przykładzie używana jest wygenerowana metoda void setCounter(int).

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

Ładne i czyste podejście. – Vivit

7

W Xtend, everything is an expression, więc «counter = counter + 1» ocenia w wyniku cesji, dlatego to będzie częścią łańcucha. Więc jeśli naprawdę chcesz wykonać efekt uboczny w pętli for wyrażenia szablonu (co jest silnie odradzane), zrób to w wyrażeniu blokowym i zwróć pusty łańcuch lub null: «{ counter = counter + 1; "" }». Niemniej jednak nie jest to zbyt eleganckie, więc możesz chcieć rozwiązać swój problem w inny sposób, jak sugerują inne odpowiedzi.

+0

Dziwne w każdym razie, jeśli muszę myśleć o tłumieniu zachowania, które z bardziej technicznego punktu widzenia może być uznane za efekt uboczny (nawet trudny efekt uboczny jest z założenia w tym przypadku). – JensG