Значение счетчика в выражении шаблона

Я хочу подсчитать значение внутри выражения шаблона в 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» также печатается. Но я хочу, чтобы приведенное выше выражение просто подсчитывало, не распечатывая его.

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


person John    schedule 21.01.2016    source источник


Ответы (2)


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

«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»

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

И, наконец, вот еще ОО-решение проблемы:

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»
    '''
}
person snorbi    schedule 22.01.2016
comment
«{counter = counter + 1; null}» сделал свое дело: Большое спасибо! - person John; 01.02.2016

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

person Diego Sevilla    schedule 22.01.2016