assign

概要

<#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:变量的名字。 它不是表达式。而它可以写作是字符串,如果变量名包含保留字符这是很有用的, 比如 <#assign "foo-bar" = 1>。 请注意这个字符串没有展开插值(如"${foo}"); 如果需要赋值一个动态创建的名字,那么不得不使用 这个技巧
  • =:赋值操作符。 它也可以是一个简写的赋值操作符(从 FreeMarker 2.3.23 版本开始): ++--+=-=*=/=%=。比如 <#assign x++><#assign x = x + 1> 是一样的,并且 <#assign x += 2><#assign x = x + 2> 是相同的。 请注意, ++ 通常意味着算术加法 (对于非数字将会失败),不像 ++= 可以进行字符连接等重载操作。
  • value: 存储的值。是表达式。
  • namespacehash:(通过 import) 为命名空间创建的哈希表。是表达式。

描述

使用该指令你可以创建一个新的变量, 或者替换一个已经存在的变量。注意仅仅顶级变量可以被创建/替换 (也就是说你不能创建/替换 some_hash.subvar, 除了 some_hash)。

关于变量的更多内容,请阅读:模板开发指南/其它/在模板中定义变量

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

<#assign seq = ["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}!">