2016-01-21 3 views
1

Я хочу подсчитать значение внутри выражения шаблона в Xtend, не распечатывая его.Значение счета в выражении шаблона

Это мой код:

def generateTower(Tower in) { 
    var counter = 0.0; 
''' 
One   Two    Three   Four 
«FOR line : in.myTable» 
«counter» «line.val1»  «line.val2»  «line.val3» 
«counter = counter + 1» 
«ENDFOR» 
''' 
    } 

Таким образом, это будет создавать таблицу с четырьмя колоннами, в то время как первый столбец увеличивается, начиная с 0.0. Проблема заключается в том, что печатается также «counter = counter + 1». Но я хочу, чтобы выражение выше просто подсчитывало, не распечатывая его.

Что может быть лучшим решением для решения этой проблемы?

ответ

1

Вы могли бы использовать это простое и читаемое решение:

«FOR line : in.myTable» 
«counter++» «line.val1»  «line.val2»  «line.val3» 
«ENDFOR» 

Если вы настаиваете на выражении отдельных приращения, используйте блок с null значения. Это работает потому, что значение null преобразуется в пустую строку в выражении шаблона с (конечно, вы могли бы использовать "" а):

«FOR line : in.myTable» 
«counter» «line.val1»  «line.val2»  «line.val3» 
«{counter = counter + 1; null}» 
«ENDFOR» 

Хотя первое решение, тем лучше. Если вам требуется сложная логика в выражении в шаблона Я рекомендую его реализацию по методу S не встроенный код ...

И, наконец, вот это более OO решения проблемы:

class TowerGenerator { 
    static val TAB = "\t" 

    def generateTower(Tower in) { 
     var counter = 0 

     ''' 
      One«TAB»Two«TAB»Three«TAB»Four 
      «FOR line : in.myTable» 
       «generateLine(line, counter++)» 
      «ENDFOR» 
     ''' 
    } 

    def private generateLine(Line line, int lineNumber) ''' 
     «lineNumber»«TAB»«line.val1»«TAB»«line.val2»«TAB»«line.val3» 
    ''' 
} 
+0

'« {counter = counter + 1; null} »' сделал трюк: Большое спасибо! – John

0

Xtend - это полноценный язык программирования. Вы можете писать Java-подобные выражения и шаблоны. Проблема в том, что вы находитесь внутри тройной цитаты (шаблона), и все, что вы там пишете, выводится. Вы можете рассчитывать внутри цикла, но учтите, что вы подсчитываете элементы в коллекции in.myTable, и это можно получить, используя in.myTable.length. Таким образом, count может быть рассчитан заранее как in.myTable.length.