例如,当您在宏中有可变参数时
<#macro m a b c...>
Run Code Online (Sandbox Code Playgroud)
调用宏时,你必须传递至少3个参数或2个参数吗?c这里的参数是否必须至少有1个值?还有什么办法可以默认将参数指定为null吗?
小智 5
<#macro name param1 param2 ... paramN>
...
<#nested loopvar1, loopvar2, ..., loopvarN>
...
<#return>
...
</#macro>
Run Code Online (Sandbox Code Playgroud)
哪里:
因此,您可以看到宏对N参数没有任何限制.
此结构创建一个宏变量(如果您知道命名空间功能,则在当前命名空间中).如果您不熟悉宏和用户定义的指令,则应阅读有关用户定义指令的教程.
宏变量存储模板片段(称为宏定义体),可用作用户定义的指令.该变量还将允许的参数名称存储到用户定义的指令中.使用变量as指令时,必须为所有这些参数赋值,但具有默认值的参数除外.当且仅当您在调用宏时没有为参数赋值时,才会使用默认值.
变量将在模板的开头创建; 它不会将宏指令放在模板中的位置.
示例:带参数的宏:
<#macro test foo bar baaz>
Test text, and the params: ${foo}, ${bar}, ${baaz}
</#macro>
<#-- call the macro: -->
<@test foo="a" bar="b" baaz=5*5-2/>
Run Code Online (Sandbox Code Playgroud)
输出:
Test text, and the params: a, b, 23
Run Code Online (Sandbox Code Playgroud)
示例:带参数和默认参数值的宏:
<#macro test foo bar="Bar" baaz=-1>
Test text, and the params: ${foo}, ${bar}, ${baaz}
</#macro>
<@test foo="a" bar="b" baaz=5*5-2/>
<@test foo="a" bar="b"/>
<@test foo="a" baaz=5*5-2/>
<@test foo="a"/>
Run Code Online (Sandbox Code Playgroud)
输出:
Test text, and the params: a, b, 23
Test text, and the params: a, b, -1
Test text, and the params: a, Bar, 23
Test text, and the params: a, Bar, -1
Run Code Online (Sandbox Code Playgroud)
但是,关于问题的最后部分,有一个解释:
空引用在FreeMarker中是设计错误.由于您提到的原因,定义自定义空值 - 这是一个字符串 - 不是一个好主意.应该使用以下构造:
您可以在宏中将空序列指定为默认参数值,并只测试它是否为空.