Freemarker - 如何间接识别缺失列表
Freemarker - How to indirectly recognize a missing list
在 Freemarker 中,如何间接识别缺失的列表变量?间接地,我的意思是我有一个包含列表名称的字符串值;我需要将该字符串转换为(列表的)变量名,然后检查列表是否存在。这种间接访问对我的应用程序至关重要。
例如,这段代码有效:
<#assign existing_list = ["a","b"]>
<#assign existing_list_name = "existing_list">
<#assign ref_existing_list = existing_list_name?eval>
<#if ref_existing_list?has_content>
Correctly identified existing list.
<#else>
Failed to identify existing list.
</#if>
生成输出:
Correctly identified existing list.
但是如果列表不存在,那么我无法将字符串转换为变量名来检查列表是否存在。例如:
<#assign nonexistent_list_name = "nonexistent_list">
<#assign ref_nonexistent_list = nonexistent_list_name?eval>
<#if ref_nonexistent_list?has_content>
Failed to identify that list was non-existent.
<#else>
Correctly identified that list was non-existent.
</#if>
终止 Freemarker 并出现以下错误:
<FreeMarker>[Error] freemarker.core.InvalidReferenceException: The following has evaluated to null or missing:
==> nonexistent_list_name?eval [in template "utilities\mhc\templates\app\app.h.ftl" at line 17, column 34]
我似乎需要能够将字符串转换为变量名,即使变量丢失,或者在不中止的情况下对空变量引用执行 eval。但我一直无法找到这些 Freemarker 功能中的任何一个。
谁能提出解决方案?
这里要认识到的关键是不能将缺失的东西分配给变量。但是你可以这样做:
<#assign nonexistent_list_name = "nonexistent_list">
<#if .vars[nonexistent_list_name]?has_content>
The list exists AND is not empty
<#else>
The list doesn't exists OR it's empty
</#if>
<#-- The above is nicer, but this still works: -->
<#if nonexistent_list_name?eval?has_content>
The list exists AND is not empty
<#else>
The list doesn't exists OR it's empty
</#if>
另一件值得知道的事情是 ?has_content
为现有但空的列表提供 false
。如果您只想检查列表是否存在,请改用 ??
(如 <#if .vars[nonexistent_list_name]??>
)。但如果你确实想以同样的方式处理空列表和缺失列表,那么毕竟你也可以做赋值:
<#assign nonexistent_list_name = "nonexistent_list">
<#assign nonexistent_listref = .vars[nonexistent_list_name]!>
<#if nonexistent_listref?has_content>
The list exists AND is not empty
<#else>
The list doesn't exists OR it's empty
</#if>
(注意#list
可以有一个#else
空列表的分支,当你想做一个列表时,它可以节省一些字符。)
在 Freemarker 中,如何间接识别缺失的列表变量?间接地,我的意思是我有一个包含列表名称的字符串值;我需要将该字符串转换为(列表的)变量名,然后检查列表是否存在。这种间接访问对我的应用程序至关重要。
例如,这段代码有效:
<#assign existing_list = ["a","b"]>
<#assign existing_list_name = "existing_list">
<#assign ref_existing_list = existing_list_name?eval>
<#if ref_existing_list?has_content>
Correctly identified existing list.
<#else>
Failed to identify existing list.
</#if>
生成输出:
Correctly identified existing list.
但是如果列表不存在,那么我无法将字符串转换为变量名来检查列表是否存在。例如:
<#assign nonexistent_list_name = "nonexistent_list">
<#assign ref_nonexistent_list = nonexistent_list_name?eval>
<#if ref_nonexistent_list?has_content>
Failed to identify that list was non-existent.
<#else>
Correctly identified that list was non-existent.
</#if>
终止 Freemarker 并出现以下错误:
<FreeMarker>[Error] freemarker.core.InvalidReferenceException: The following has evaluated to null or missing:
==> nonexistent_list_name?eval [in template "utilities\mhc\templates\app\app.h.ftl" at line 17, column 34]
我似乎需要能够将字符串转换为变量名,即使变量丢失,或者在不中止的情况下对空变量引用执行 eval。但我一直无法找到这些 Freemarker 功能中的任何一个。
谁能提出解决方案?
这里要认识到的关键是不能将缺失的东西分配给变量。但是你可以这样做:
<#assign nonexistent_list_name = "nonexistent_list">
<#if .vars[nonexistent_list_name]?has_content>
The list exists AND is not empty
<#else>
The list doesn't exists OR it's empty
</#if>
<#-- The above is nicer, but this still works: -->
<#if nonexistent_list_name?eval?has_content>
The list exists AND is not empty
<#else>
The list doesn't exists OR it's empty
</#if>
另一件值得知道的事情是 ?has_content
为现有但空的列表提供 false
。如果您只想检查列表是否存在,请改用 ??
(如 <#if .vars[nonexistent_list_name]??>
)。但如果你确实想以同样的方式处理空列表和缺失列表,那么毕竟你也可以做赋值:
<#assign nonexistent_list_name = "nonexistent_list">
<#assign nonexistent_listref = .vars[nonexistent_list_name]!>
<#if nonexistent_listref?has_content>
The list exists AND is not empty
<#else>
The list doesn't exists OR it's empty
</#if>
(注意#list
可以有一个#else
空列表的分支,当你想做一个列表时,它可以节省一些字符。)