从另一个变量中分配变量

时间:2017-10-06 00:17:58

标签: freemarker

我正在尝试从另一个变量中分配变量。我的代码看起来像这样

   <#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:以下内容已评估为null或缺失: ==&GT; ctgroutes![&#34; $ {Y} .. $ {X} - $ {米}&#34;] ctgroutes [&#34; $ {X} .. $ {Y} - $ {米}&# 34;] [在模板&#34; RouteCompare-WptTable.ftlh&#34;第5栏第24栏

我希望null结果只返回一张空地图,但这似乎不可能:

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个的变量:

  1. ctgroutes [&#34; $ {y} .. $ {x} - $ {m}&#34;] //假设它不为空
  2. ctgroutes [&#34; $ {x} .. $ {y} - $ {m}&#34;] //假设它不为空
  3. {} //空地图
  4. 最好的方法是什么?

1 个答案:

答案 0 :(得分:1)

如果我很清楚你想要实现的目标,你可以这样写:

<#assign ctg = ctgroutes["${y}..${x}-${m}"]!ctgroutes["${x}..${y}-${m}"]!{}>

另请注意,<#assign target>...</#assign>用于将两个标记之间打印的输出捕获到target变量中(而不是实际打印它)。因此target将始终存储字符串或标记值。 FreeMarker标签和${}之外的东西也只是静态文本,不会被解析。所以,天真但有效的方法就是使用#if / #elseif / #else并在每个内部都有一个单独的#assign ctg = ...,但你可以使用!运算符,如图所示。