<element>_has_next 是遗留的 Freemarker 语法吗?
Is <element>_has_next a legacy Freemarker syntax?
在 freemarker 文档中发现了以下行,用于检查是否有更多元素:
<#list myList as myVar>...<#if myVar_has_next>...</#if></#list>
我知道“?”用于调用内置函数,以及关于 "has_next",即 myVar?has_next。我不熟悉在 var 和内置变量之间使用下划线。这是遗留语法吗?
这似乎是一个未记录的功能。 freemarker.core.IteratorBlock 中的相关代码表明 myVar_has_next
实际上只是一个变量的名称。但是因为代码检查附加到循环变量名称 (myVar
) 的 _has_next
(和 _index
,fwiw)的出现,Freemarker 能够为这个变量赋值。
至少在 Freemarker 2.3.23 中,我无法重现您提到的错误。下面的代码虽然使用了 myVar?has_next
但工作正常
public static void main(String[] args) throws IOException, TemplateException {
Configuration cfg = new Configuration(Configuration.VERSION_2_3_23);
cfg.setTemplateExceptionHandler(TemplateExceptionHandler.RETHROW_HANDLER);
Template template = new Template("test", "<#list myList as myVar>${myVar} <#if myVar?has_next>has next. </#if></#list>", cfg);
template.process((Object) Collections.singletonMap("myList", Arrays.asList("a", "b", "c")), new OutputStreamWriter(System.out));
}
生产
a has next. b has next. c
编辑:v2.3.23 中的此功能has been deprecated(参见@ddekany 的评论)
在 freemarker 文档中发现了以下行,用于检查是否有更多元素:
<#list myList as myVar>...<#if myVar_has_next>...</#if></#list>
我知道“?”用于调用内置函数,以及关于 "has_next",即 myVar?has_next。我不熟悉在 var 和内置变量之间使用下划线。这是遗留语法吗?
这似乎是一个未记录的功能。 freemarker.core.IteratorBlock 中的相关代码表明 myVar_has_next
实际上只是一个变量的名称。但是因为代码检查附加到循环变量名称 (myVar
) 的 _has_next
(和 _index
,fwiw)的出现,Freemarker 能够为这个变量赋值。
至少在 Freemarker 2.3.23 中,我无法重现您提到的错误。下面的代码虽然使用了 myVar?has_next
public static void main(String[] args) throws IOException, TemplateException {
Configuration cfg = new Configuration(Configuration.VERSION_2_3_23);
cfg.setTemplateExceptionHandler(TemplateExceptionHandler.RETHROW_HANDLER);
Template template = new Template("test", "<#list myList as myVar>${myVar} <#if myVar?has_next>has next. </#if></#list>", cfg);
template.process((Object) Collections.singletonMap("myList", Arrays.asList("a", "b", "c")), new OutputStreamWriter(System.out));
}
生产
a has next. b has next. c
编辑:v2.3.23 中的此功能has been deprecated(参见@ddekany 的评论)