如何在Freemarker中将变量设置为null

16

我在任何问题中都找不到相关的内容,这是一些非常基础的东西,但我无法弄明白。

我的问题是我不知道如何在Freemarker中将一个变量设置为空。 例如:

${hi!"bye"}          <#-- Prints "bye" because hi is undefined -->
<#assign hi="hi">    <#-- Sets a value to the var hi -->
${hi!"bye"}          <#-- Prints "hi" because hi has a value -->
<#assign hi=null>    <#-- This does not work but is what I am looking for -->
${hi!"bye"}          <#-- I want it to print "bye" because hi should be undefined -->

我遇到了这个问题,因为我迭代列表并在特定项验证某些逻辑后设置一个变量,然后检查该变量是否存在,但如果第一项创建了该变量,则我将会有这个变量设置为列表中其余项目的值。

3个回答

15

没有"unassign",也没有null的概念存在于FreeMarker中(至少在2.4.0之前是这样的,但那个版本已经很老了)。它只有缺失的变量(可能从技术上讲是一个null,也可能根本不存在),以及那些已经存在的变量。我不太明白为什么在你的情况下需要它。你能展示一个简化的例子吗?


1
我需要它是因为我要遍历一个列表,并且我想在每个循环的开始将变量置空,这样我就可以检查它是否为空。我使用 assign == "" 来修复它,然后使用 ?has_content 进行检查。无论如何,还是谢谢! - Pablo Matias Gomez
1
所以你实际上需要一个作用域变量。现在,为了实现这一点,你可以从循环体中调用一个 #function。在那里,你可以拥有 #local 变量。 - ddekany
你是指一个作用域变量,其作用域将在每个循环中存在?这是否可能? - Pablo Matias Gomez
2
除了标准的“循环变量”之外,您不能拥有属于循环体的作用域变量。但是,您可以定义一个#macro(不是#function...那是一个打字错误),然后从循环内部调用它,在那里您可以拥有#local - ddekany

8

您可以将空字符串赋值给变量,并使用内置的?has_content检查它是否已设置:

${hi?has_content?then(hi, "bye")}
<#assign hi="hi">
${hi?has_content?then(hi, "bye")}
<#assign hi="">
${hi?has_content?then(hi, "bye")}

这将呈现为:
bye
hi
bye

4

根据您的需求,可以使用不同类型来表示“缺失”值。

例如,如果您有一个通常是数字的变量myVariable,请将其赋为false,然后不要检查myVariable??,而是检查myVariable!false?is_number。这将涵盖两种情况(不存在和“未设置”)。

${ (myVariable!false?is_number)?c }

<#assign myVariable = 12 >
${ (myVariable!false?is_number)?c }

<#assign myVariable = false >
${ (myVariable!false?is_number)?c }

结果:

false
12
false

去试一下


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接