模板表达式中的计数值

Count value in template expression

我想在 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»
'''
    }

因此这将生成一个包含四列的 table,而第一列从 0.0 开始递增。问题是 «counter = counter + 1» 也被打印出来了。但是我希望上面的表达式只是计数,而不是打印出来。

解决这个问题的最佳方案是什么?

您可以使用这个简单易读的解决方案:

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

如果您坚持使用单独的 增量表达式 ,请使用具有 null 值的 。这是有效的,因为 null 值在 模板表达式 s 中被转换为空字符串(当然你也可以使用 ""):

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

Xtend 是一种 full-fledged 编程语言。您可以编写 Java-like 表达式和模板。那里的问题是你在三重引号(模板)中,你在那里写的所有内容都会被输出。您可以在循环内计数,但要考虑到您正在对 in.myTable 集合中的元素进行计数,这可以使用 in.myTable.length 获得。所以 count 可以预先计算为 in.myTable.length.