freemarker宏中变量参数的最小参数

Ann*_*ews 3 macros freemarker

例如,当您在宏中有可变参数时

 <#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)

哪里:

  • name:宏变量的名称.这不是表达.它遵循与顶级变量引用相同的语法,如myMacro或my-macro.但是,它也可以写为字符串文字,如果宏名称包含无法在标识符中指定的字符,则非常有用,例如<#macro"foo~bar"> ....请注意,此字符串literal不会扩展插值(如"$ {foo}").
  • param1,param2,...等:局部变量的名称存储参数值(非表达式),可选地后跟=和默认值(即表达式).默认值甚至可以是另一个参数,例如<#macro section title label = title>.参数名称使用与顶级变量引用相同的语法,因此适用相同的功能和限制.
  • paramN,最后一个参数可以选择有3个尾随点(...),表示宏采用可变数量的参数,并且在最后一个参数中也会收集与任何其他参数不匹配的参数(也称为catch-all参数).当使用命名参数调用宏时,paramN将是包含传递给宏的所有未声明的键/值对的散列.当使用位置参数调用宏时,paramN将是额外参数值的序列.(在宏内部,要找出是哪种情况,你可以使用myCatchAllParam?is_sequence.)

因此,您可以看到宏对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中是设计错误.由于您提到的原因,定义自定义空值 - 这是一个字符串 - 不是一个好主意.应该使用以下构造:

  • 宏和函数参数可以具有默认值,因此调用者可以省略它们
  • 要检查变量是否为null,您应该使用?? operator:<#if(name ??)>
  • 当你使用一个可以为null的变量时,你应该使用!运算符指定默认值:name!"No name"
  • 要检查序列(或字符串)是否为空,请使用?has_content builtin:<#if(names?has_content)>

您可以在宏中将空序列指定为默认参数值,并只测试它是否为空.