我目前正在使用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)

您可以通过简单地将提供的示例复制并粘贴到foo.html中来尝试here片段。

错误消息
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内-将行#6 @foo(someString, false)更改为@bar(someString, false)

现在,将以下行放入foo.html:
@bar("foo", true)

这样做时,错误更改为:
java.lang.SecurityException: java.util.concurrent.TimeoutException

我认为这证明了我的上述假设,因为Rythm现在似乎找到了模板(或方法)。这基本上就是我遇到的问题。

因此,问题是:是否有任何方法可以根据某些条件递归调用Rythm模板?

我也欢迎其他建议,因为递归通常可以非递归方式处理。我只是想避免重复的代码。

最佳答案

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)})
}

以下是在节奏小提琴上进行的测试

java - 有什么方法可以根据某些条件递归调用Rythm模板吗?-LMLPHP

07-28 09:16