xTend:如何阻止变量在输出中打印?

GSU*_*bit 5 xtend

假设您在xTend中有以下代码:

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

}
Run Code Online (Sandbox Code Playgroud)

这将以以下格式生成输出:

    Line Numnber: 0
    1
    Line Numnber: 1
    2
    Line Numnber: 2
    3
    Line Numnber: 3
    ...
Run Code Online (Sandbox Code Playgroud)

如何让xTend不打印仅使用计数器的行,只打印行号行,使得输出如下所示:

Line Numnber: 0
Line Numnber: 1
Line Numnber: 2
Line Numnber: 3
...
Run Code Online (Sandbox Code Playgroud)

thS*_*oft 8

在Xtend中,一切都是一个表达式,因此«counter = counter + 1»对赋值结果进行求值,这就是为什么它将成为字符串的一部分.因此,如果您真的想在模板表达式的for循环中执行副作用(强烈建议不要这样做),请在块表达式中执行并返回空字符串或null : «{ counter = counter + 1; "" }». 然而,这并不是太优雅,所以你可能想以另一种方式解决你的问题,正如其他答案所暗示的那样.


A.H*_*.H. 3

在你的例子中没有用counter。因此很难猜测你的真正用例是什么。在大多数情况下,一些基于的计算i就足够了,消除counter完全消除。Orionll 的回答就指向了这个方向。

\n\n

然而,如果counter无法计算而是i某种累积状态,那么最简单的方法就是将该状态提取到自定义类中并使用void方法修改该状态。在本例中生成的void setCounter(int)使用生成的方法。

\n\n
class Example {\n    def static void main(String[] args) {\n        println(generate)\n    }\n\n    def static generate() '''\n        \xc2\xabvar state = new State(0)\xc2\xbb\n        \xc2\xabFOR i : 0 ..< 10\xc2\xbb\n            Line Numnber: \xc2\xabi\xc2\xbb\n            \xc2\xabstate.setCounter(state.counter + 1)\xc2\xbb\n        \xc2\xabENDFOR\xc2\xbb\n    '''\n\n}\n\nclass State {\n    @Property\n    var int counter\n\n    new(int counter){\n        this.counter = counter\n    }\n}\n
Run Code Online (Sandbox Code Playgroud)\n