【问题标题】:Is there any way to recursively invoke a Rythm template based on some condition?有什么方法可以根据某些条件递归调用 Rythm 模板?
【发布时间】:2017-03-24 13:49:29
【问题描述】:

我目前正在使用 Rythm 创建一些 sn-ps - 与 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 级递归。不过,我想稍后在 @foo(someString, false) 行中使用条件而不是 false

您可以尝试 sn-p 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 只查找 other 模板 - 或者看起来是这样。

使用上面的链接访问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 模板?

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

【问题讨论】:

    标签: java rythm


    【解决方案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)})
    }
    

    以下是在 rythm fiddle 上进行的测试

    【讨论】:

    • 完美,解决了问题!除了您发送的示例之外,我仍然找不到任何文档。请问您也可以提供一些文档链接吗?
    • 另外,这是我打开的问题:#363
    • @mcuenez 不幸的是,当前文档中缺少此功能。请在 github 上向 rythm-doc 项目提交问题以跟踪它
    • 现在这就解释了为什么我找不到它。有那么一瞬间,我以为我忘记了如何使用谷歌搜索。谢谢你的帮助。这是 rythm-doc 问题:#43.
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-11-01
    • 1970-01-01
    • 1970-01-01
    • 2021-04-09
    • 2017-10-27
    • 1970-01-01
    相关资源
    最近更新 更多