我目前正在使用Rythm创建一些代码段 - 与AST结合使用,因为模板依赖于Java文件。
Invoking templates按预期工作。有一个意外的行为。我想以递归方式调用模板,但似乎这是不可能的。
Foo.html模板
@args String someString, boolean recursion
Calling foo template with recursion: @recursion
@if(recursion) {
A recursion was requested: @recursion
@foo(someString, false)
}
注意根据此示例的意图,这仅提供1级递归。但是,我希望稍后在false
行中使用条件而不是@foo(someString, false)
。
您只需复制&amp ;;即可试用代码段here。将提供的示例粘贴到foo.html
。
错误消息
The method foo(String, boolean) is undefined for the type Cfoo_html__R_T_C__
Template: /foo.html
Relevant template source lines:
-------------------------------------------------
1: @args String someString, boolean recursion
2:
3: Calling foo template with recursion: @recursion
4: @if(recursion) {
5: A recursion was requested: @recursion
>> 6: @foo(someString, false)
7: }
/*
* Omitted for the sake of readability.
*/
现在,错误似乎与递归无关。虽然,这是我在Eclipse中看到的错误信息。
我想,在调用模板时,无法在其自身内调用它,因为Rythm只查找其他模板 - 或者看起来似乎是这样。
使用上面的链接访问Rythm Fiddle,将代码放在bar.html
内而不是foo.html
- 从@foo(someString, false)
更改行#6 @bar(someString, false)
。
现在,将以下行放在foo.html
:
@bar("foo", true)
执行此操作时,错误将更改为:
java.lang.SecurityException: java.util.concurrent.TimeoutException
我认为这证明了我的上述假设,因为Rythm现在似乎找到了模板(或方法,即)。这基本上就是我被困住的地方。
所以,问题是:有没有办法根据某些条件递归调用Rythm模板?
我也愿意接受其他建议,因为递归通常可以以非递归的方式处理。我只想避免重复的代码。
答案 0 :(得分:1)
Rythm支持@this()
指令以递归方式加载模板。见http://play-rythm-demo.appspot.com/demo/fibonacci
然而,看起来引入了一个错误,现在即使指定了终止条件,它也会引发StackOverflowError
。请向https://github.com/rythmengine/rythmengine/issues
<强>更新强>
StackOverflowError
由boolean
类型引起。如果使用其他类型的变量来控制递归调用的终止,它的效果都很好。
@args String foo, int i
<h1>@foo</h1>
Calling foo template with recursion: @i
@if(i > 1) {
A recursion was requested: @i
@this({foo: foo, recursion: false, i: (i - 1)})
}
以下是对节奏小提琴的测试