【问题标题】:Count value in template expression计算模板表达式中的值
【发布时间】:2016-01-22 18:20:43
【问题描述】:

我想在 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» 也被打印出来了。但我希望上面的表达式只是计数,而不是打印出来。

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

【问题讨论】:

    标签: templates xtend


    【解决方案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»
        '''
    }
    

    【讨论】:

    • «{counter = counter + 1; null}» 成功了:非常感谢!
    【解决方案2】:

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

    【讨论】:

      猜你喜欢
      • 2011-12-31
      • 2012-01-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多