在宏中有可变参数时,例如
<#macro m a b c...>
调用宏时,你必须传递至少3个参数或2个参数吗?这里的参数c
是否必须至少有1个值?还有什么方法可以默认将参数指定为null吗?
答案 0 :(得分:5)
<#macro name param1 param2 ... paramN>
...
<#nested loopvar1, loopvar2, ..., loopvarN>
...
<#return>
...
</#macro>
其中:
因此,您可以看到宏对N参数没有任何限制。
此结构创建一个宏变量(如果您知道命名空间功能,则在当前命名空间中)。如果您不熟悉宏和user-defined directives,那么您应该阅读有关用户定义指令的教程。
宏变量存储可用作用户定义指令的模板片段(称为宏定义主体)。该变量还将允许的参数名称存储到用户定义的指令中。 当您将变量用作指令时,必须为所有这些参数赋值,但具有默认值的参数除外。当且仅当您在调用宏时没有为参数赋值时,才会使用默认值。
变量将在模板的开头创建;它不会将宏指令放在模板中的位置。
示例:带参数的宏:
<#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/>
输出:
Test text, and the params: a, b, 23
示例:带参数和默认参数值的宏:
<#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"/>
输出:
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
但是,关于问题的最后一部分,有explanation:
空引用在设计中是FreeMarker中的错误。由于您提到的原因,定义自定义空值 - 这是一个字符串 - 不是一个好主意。应该使用以下结构:
您可以在宏中指定一个空序列作为默认参数值,只需测试它是否为空。
答案 1 :(得分:0)
如果宏中有变量参数,则不必为最后一个参数传递值。
例如:
<#macro m a b c...>
a = ${a!}
b = ${b!}
<#list c?keys as attr>
${attr} = ${c[attr]}
</#list>
</#macro>
<@m a='A' b='B' />
<@m a='A' b='B' c='C' d='D'/>
将输出:
a = A
b = B
a = A
b = B
c = C
d = D