从另一个变量分配一个变量

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 的简单方法。

更新:

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

  1. ctgroutes["${y}..${x}-${m}"] // 假设不为空
  2. ctgroutes["${x}..${y}-${m}"] // 假设不为空
  3. {} // 一张空地图

最好的方法是什么?

如果我理解你想要达到的效果,你可以这样写:

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

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