这是Google Group中我的问题的转贴。希望我会在这里得到一些回应。
我经常遇到这个问题。如果文本不为空,我想生成一行文本。如果为空,则不生成该行。插图模板:
namespace @classSpec.getNamespace() @classSpec.getComment() class @classSpec.getName() { ... }
如果@ classSpec.getComment()返回有意义的注释文本,结果看起来像
namespace com.example // this is comment class MyClass { ... }
但如果没有评论,那将是
namespace com.example class MyClass { ... }
注意额外的空行?我不想要这个。目前解决方案是将模板编写为
namespace @classSpec.getNamespace() @classSpec.getComment()class @classSpec.getName() { ... }
并确保getComment()会在返回值后附加“\ n”。这使得模板的可读性更低。另外,想象一下我需要在for循环中生成一个带有多个参数的函数。如果每个参数都需要复杂的模板代码逻辑,我需要将它们全部写成如上所述的一行。否则,结果文件将具有类似
的功能function myFunction( String stringParam, Integer intParam, Long longParam )
核心问题是,模板文件不仅包含脚本,还包含要在输出中写入的原始文本。对于脚本部分,我们需要换行符和缩进。我们希望像编译器通常那样修剪空间。但对于原始文本,我们希望空格与文件中指定的一样精确。我觉得我们需要更多的原始文本控制机制来协调这两个部分。
具体到这种情况,是否有一些特殊符号将多行视为输出中的单行?例如,就像我们可以写
一样namespace @classSpec.getNamespace() @classSpec.getComment()\\ class @classSpec.getName() { ... }
谢谢!
答案 0 :(得分:0)
这只是一个已知的错误,请参阅
不幸的是,目前还没有适当的解决办法。您可能希望将您的评论添加到上面的错误中并引用您的问题。
请参阅下面的示例,您可以在http://fiddle.rythmengine.org/#/editor
上试用@def setXTimesY(int x,int y) { @{ int result=x*y;} @(result)}
1
2 a=@setXTimesY(2,3)
3 b=@setXTimesY(3,5)
4 c=@setXTimesY(4,7)
5
这将正确创建输出:
1
2 a= 6
3 b= 15
4 c= 28
5
现在尝试美化@def setXTimesY ......
@def setXTimesY(int x,int y) {
@{
int result=x*y;
}@(result)}
1
2 a=@setXTimesY(2,3)
3 b=@setXTimesY(3,5)
4 c=@setXTimesY(4,7)
会给出错误的结果
1 2 a =(结果) 3 b =(结果) 4 c =(结果)
@def setXTimesY(int x,int y) {
@{
int result=x*y;
} @(result)}
1
2 a=@setXTimesY(2,3)
3 b=@setXTimesY(3,5)
4 c=@setXTimesY(4,7)
更好,但增加了一个空格
所以
是同一行的另一个错误
答案 1 :(得分:0)
我遇到了同样的问题。我在自己的Rythm中找不到解决方案。
为了在模板中处理多行而获得单行,我必须以后处理的形式实现我自己的机制。在模板中,在我想要加入下一行的每一行的末尾,我使用自定义符号/标记作为标记。然后,一旦处理完模板,我就用一个空字符串替换那个符号/标记以及紧跟在它之后的换行符。
例如,如果您使用名为" #join-next-line#"的标记,模板将如下所示:
@for (Bar bar : foo.getBars()).join (", ") {
@bar.name#join-next-line#
}
它不是完美的解决方案,但它对我有用。