gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-02 00:54:39 26 4
gpt4 key购买 nike

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

 <#macro m a b c...>

调用宏时是否必须至少传递 3 个参数或 2 个参数?这里的参数c是否必须至少有1个值?还有什么方法可以将参数默认指定为空吗?

最佳答案

<#macro name param1 param2 ... paramN>
...
<#nested loopvar1, loopvar2, ..., loopvarN>
...
<#return>
...
</#macro>

地点:

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

因此,如您所见,宏对于采用 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/>

Output:

 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"/>

Output:

  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 中设计的一个错误。由于您提到的原因,定义自定义空值(它是一个字符串)并不是一个好主意。应改用以下结构:

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

您可以在宏中指定一个空序列作为默认参数值,并简单地测试它是否为空。

关于macros - freemarker 宏中变量参数的最小参数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36740190/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com