assign 指令

使用 <#assign> 指令你可以创建一个新的变量,或者替换一个已经存在的变量。

注意:仅仅顶级变量可以被创建/替换,也就是说你不能创建/替换 user.name,但是可以整体替换 user。

语法

<#assign name1=value1 name2=value2 ... nameN=valueN>
<!-- 或 -->
<#assign same as above... in namespacehash>
<!-- 或 -->
<#assign name>
    capture this
</#assign>
<!-- 或 -->
<#assign name in namespacehash>
    capture this
</#assign>

参数说明:

  • name:变量的名字,是一个字符串

  • =:赋值操作符。它也可以是一个简写的赋值操作符 (从 FreeMarker 2.3.23 版本开始): ++,--, +=,-=, *=,/= 或 %=。比如 <#assign x++> 和 <#assign x = x + 1> 是一样的,并且 <#assign x += 2> 和 <#assign x = x + 2> 是相同的。 请注意,++ 通常意味着算术加法 (对于非数字将会失败),不像 + 或 += 可以进行字符连接等重载操作。

  • value: 变量存储的值,可以是具体指,也可以是表达式。

  • namespacehash:通过 import 指令导入库,为库的命名空间创建的哈希表。如:<#assign date="2020-06-20" in my>

实例

比如:变量 seq 存储一个序列:

<#assign seq = ["foo", "bar", "baz"]>
<#list seq>
    <#items as item>${item}<#sep>,</#items>
</#list>

输出结果:

foo,bar,baz

比如:变量 x 中存储增长的数字:

<#assign x++>

作为一个方便的特性,你可以使用一个 assign 标记来进行多次定义。比如这个会做上面两个例子中相同的事情:

<#assign
    seq = ["foo", "bar", "baz"]
    x++
>

如果你知道什么是命名空间:assign 指令在命名空间中创建变量。通常它在当前的命名空间 (也就是和标签所在模板关联的命名空间) 中创建变量。但如果你是用了 in namespacehash, 那么你可以用另外一个命名空间来创建/替换变量。比如,这里你在命名空间中 /mylib.ftl 创建/替换了变量 bgColor:

<#import "/mylib.ftl" as my>
<#assign bgColor="red" in my>

assign 的极端使用是当它捕捉它的开始标记和结束标记中间生成的输出时。也就是说,在标记之间打印的东西将不会在页面上显示,但是会存储在变量中。比如:

<#macro myMacro>foo</#macro>
<#assign x>
  <#list 1..3 as n>
    ${n} <@myMacro />
  </#list>
</#assign>
Number of words: ${x?word_list?size}
${x}

将会输出:

Number of words: 6
    1 foo
    2 foo
    3 foo

请注意,你不应该使用它来往字符串中插入变量:

<#assign x>Hello ${user}!</#assign> <#-- BAD PRACTICE! -->

你可以这么来写:

<#assign x="Hello ${user}!">
说说我的看法
全部评论(
没有评论
关于
本网站专注于 Java、数据库(MySQL、Oracle)、Linux、软件架构及大数据等多领域技术知识分享。涵盖丰富的原创与精选技术文章,助力技术传播与交流。无论是技术新手渴望入门,还是资深开发者寻求进阶,这里都能为您提供深度见解与实用经验,让复杂编码变得轻松易懂,携手共赴技术提升新高度。如有侵权,请来信告知:hxstrive@outlook.com
公众号