从另一个变量分配一个变量
Assigning a variable from another variable
我正在尝试从另一个变量分配一个变量。我的代码看起来像这样
<#macro ctglink c rhs x y z m e b>
<#assign ctg>
<#if ctgroutes["${y}..${x}-${m}"]??>ctgroutes['${y}..${x}-${m}']
<#elseif ctgroutes["${x}..${y}-${m}"]??>ctgroutes['${x}..${y}-${m}']
<#else>{}</#if>
</#assign>
但是,这个 ctg
变量正在评估 ctgroutes['227..257-TPPMD04X02']
它实际上并没有评估字符串本身。
我已经尝试了 ?eval
、?interpret
和其他一些非常棘手的事情来让它工作,不行。即使 {}
也是一个字符串
基本上,我需要 assign 函数像旧的 PHP eval()
函数一样工作。我正在尝试访问 Map 中的值,其键是从数据状态派生的,因此我看不到任何不评估键即可查询 Map 的简单方法。
更新:
- 我忘了在里面加上
elseif
- 无论哪种方式,我都试过
<#assign ctg = ctgroutes["${y}..${x}-${m}"]!ctgroutes["${x}..${y}-${m}"]>
但我收到以下错误:
原因:freemarker.core.InvalidReferenceException:以下计算结果为空或缺失:
==> ctgroutes["${y}..${x}-${m}"]!ctgroutes["${x}..${y}-${m}"] [在模板中 "RouteCompare-WptTable.ftlh" 在第 5 行,第 24 列]
我希望 null
结果只是 return 一张空地图,但这似乎不可能:
Caused by: java.lang.RuntimeException: freemarker.core.InvalidReferenceException: The following has evaluated to null or missing:
==> ctgroutes["${y}..${x}-${m}"]!ctgroutes["${x}..${y}-${m}"] [in template "RouteCompare-WptTable.ftlh" at line 5, column 24]
所以基本上,我的目标是我需要分配一个可以采用 3 个值中的 1 个的变量:
- ctgroutes["${y}..${x}-${m}"] // 假设不为空
- ctgroutes["${x}..${y}-${m}"] // 假设不为空
- {} // 一张空地图
最好的方法是什么?
如果我理解你想要达到的效果,你可以这样写:
<#assign ctg = ctgroutes["${y}..${x}-${m}"]!ctgroutes["${x}..${y}-${m}"]!{}>
另请注意,<#assign target>...</#assign>
用于将两个标记之间打印的输出捕获到 target
变量中(而不是实际打印它)。所以 target
将始终存储字符串或标记值。此外,FreeMarker 标签和 ${}
之外的内容只是静态文本,不会被解析。因此,天真但有效的方法只是使用 #if
/#elseif
/#else
并在每个内部有一个单独的 #assign ctg = ...
,但是您可以使用!
运算符,如图所示。
我正在尝试从另一个变量分配一个变量。我的代码看起来像这样
<#macro ctglink c rhs x y z m e b>
<#assign ctg>
<#if ctgroutes["${y}..${x}-${m}"]??>ctgroutes['${y}..${x}-${m}']
<#elseif ctgroutes["${x}..${y}-${m}"]??>ctgroutes['${x}..${y}-${m}']
<#else>{}</#if>
</#assign>
但是,这个 ctg
变量正在评估 ctgroutes['227..257-TPPMD04X02']
它实际上并没有评估字符串本身。
我已经尝试了 ?eval
、?interpret
和其他一些非常棘手的事情来让它工作,不行。即使 {}
也是一个字符串
基本上,我需要 assign 函数像旧的 PHP eval()
函数一样工作。我正在尝试访问 Map 中的值,其键是从数据状态派生的,因此我看不到任何不评估键即可查询 Map 的简单方法。
更新:
- 我忘了在里面加上
elseif
- 无论哪种方式,我都试过
<#assign ctg = ctgroutes["${y}..${x}-${m}"]!ctgroutes["${x}..${y}-${m}"]>
但我收到以下错误:
原因:freemarker.core.InvalidReferenceException:以下计算结果为空或缺失: ==> ctgroutes["${y}..${x}-${m}"]!ctgroutes["${x}..${y}-${m}"] [在模板中 "RouteCompare-WptTable.ftlh" 在第 5 行,第 24 列]
我希望 null
结果只是 return 一张空地图,但这似乎不可能:
Caused by: java.lang.RuntimeException: freemarker.core.InvalidReferenceException: The following has evaluated to null or missing:
==> ctgroutes["${y}..${x}-${m}"]!ctgroutes["${x}..${y}-${m}"] [in template "RouteCompare-WptTable.ftlh" at line 5, column 24]
所以基本上,我的目标是我需要分配一个可以采用 3 个值中的 1 个的变量:
- ctgroutes["${y}..${x}-${m}"] // 假设不为空
- ctgroutes["${x}..${y}-${m}"] // 假设不为空
- {} // 一张空地图
最好的方法是什么?
如果我理解你想要达到的效果,你可以这样写:
<#assign ctg = ctgroutes["${y}..${x}-${m}"]!ctgroutes["${x}..${y}-${m}"]!{}>
另请注意,<#assign target>...</#assign>
用于将两个标记之间打印的输出捕获到 target
变量中(而不是实际打印它)。所以 target
将始终存储字符串或标记值。此外,FreeMarker 标签和 ${}
之外的内容只是静态文本,不会被解析。因此,天真但有效的方法只是使用 #if
/#elseif
/#else
并在每个内部有一个单独的 #assign ctg = ...
,但是您可以使用!
运算符,如图所示。