我已经用java编写了一段代码,现在我必须将其转换为Xtend模板。不过我用 while 循环写了以下内容。
index = refin.size()-1
while (index > 0){
System.out.println(refin.get(index) + "::=" + refin.get(index-1))
index-=2
}
现在我发现Xtend模板不支持WHILE,而且我也无法编写以下内容:
«FOR index : refin.size()-1 ; index >= 0 ; index -=2»
关于如何使用 while 循环(或类似的东西)来完成与我在 Xtend 模板中所做的相同的事情,有什么想法吗?
非常感谢!
对我来说效果很好
val String[] refin = #["1", "a", "2", "b", "3", "c"]
var index = refin.size - 1
while(index > 0) {
println(refin.get(index) + "::=" + refin.get(index -1))
index -= 2
}
// c::=3
// b::=2
// a::=1
您是对的,Xtend 在模板表达式中既不支持 for 循环,也不支持 while 循环。模板中仅支持 for-each 样式循环。您当然可以将整个模板字符串移动到常规循环中,但您可能会失去模板字符串的一些好处。 最好的选择是将 for 循环重写为可迭代范围内的 foreach 循环。
对于步长为
1
或
-1
的常见情况,您可以使用范围运算符。要么像 0 ..< list.size
一样包含向前迭代,要么像 refin.size >.. 0
那样向后迭代,例如:val String result = '''
«FOR i : list.size >.. 0»
«i»
«ENDFOR»
'''
在步长为
-2
的情况下,您不能使用范围运算符,但可以使用
org.eclipse.xtext.xbase.lib.IntegerRange
代替,它允许您定义步长:val String[] refin = #["1", "a", "2", "b", "3", "c"]
val String result = '''
«FOR i : new IntegerRange(refin.size-1, 0, -2)»
«refin.get(i)»::=«refin.get(i - 1)»
«ENDFOR»
'''