1

这是我在Google Group中的问题的转贴。希望我能在这里得到一些回应。

我经常遇到这个问题。如果文本不为空,我想生成一行文本。如果为空,则不生成该行。插图模板:

命名空间@classSpec.getNamespace()

@classSpec.getComment()
类@classSpec.getName() {
  ...
}

如果@classSpec.getComment() 返回有意义的注释文本,结果看起来像

命名空间 com.example

// 这是注释
我的班级{
  ...
}

但是如果没有评论,那就是

命名空间 com.example


我的班级{
  ...
}

注意到多余的空行了吗?我不想要这个。目前的解决方案是将模板编写为

命名空间@classSpec.getNamespace()

@classSpec.getComment()class @classSpec.getName() {
  ...
}

并确保 getComment() 将“\n”附加到返回值。这使得模板的可读性大大降低。另外,假设我需要在 for 循环中生成一个具有多个参数的函数。如果每个参数都需要模板代码的复杂逻辑,我需要像上面一样将它们全部写在一行中。否则,结果文件将具有类似的功能

函数我的函数(
  字符串字符串参数,
  整数 intParam,
  长长参数
)

核心问题是,模板文件不仅包含脚本,还包含要写入输出的原始文本。对于脚本部分,我们需要换行符和缩进。我们希望像编译器通常做的那样修剪空间。但是对于原始文本,我们希望空格与文件中指定的完全相同。我觉得我们需要更多的原始文本控制机制来协调这两个部分。

针对这种情况,是否有一些特殊符号可以将输出中的多行视为单行?例如,如果我们可以写

命名空间@classSpec.getNamespace()

@classSpec.getComment()\\
类@classSpec.getName() {
  ...
}

谢谢!

4

2 回答 2

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)

更好但增加了空间

所以

是另一个相同的错误

于 2015-05-21T09:29:12.017 回答
0

我遇到了同样的问题。我无法在自己的节奏中找到解决方案。

为了在模板中处理多行后获得单行,我必须以后处理的形式实现我自己的机制。在模板中,在我想加入下一行的每一行的末尾,我使用自定义符号/标签作为标记。然后,一旦处理了模板,我就用一个空字符串替换那个符号/标签,以及它后面的换行符。

例如,如果您使用名为“#join-next-line#”的标签,则模板将如下所示:

@for (Bar bar : foo.getBars()).join (", ") {
@bar.name#join-next-line#
}

这不是完美的解决方案,但它对我有用。

于 2015-12-16T17:22:16.190 回答