是否可以插入 freemarker 宏?

bre*_*ine 0 template-engine freemarker templating templating-engine string-interpolation

假设我有一个 freemarker 宏:

<#macro helloObject>
  World
</#macro>
Run Code Online (Sandbox Code Playgroud)

在某些情况下,我可以轻松调用它:

Hello, <@helloObject/>!
Run Code Online (Sandbox Code Playgroud)

但是插入它的语法是什么,例如,如果它是字符串的一部分?

<#assign greeting="Hello, <@helloObject>!"     /> <#-- doesn't work -->
<#assign greeting="Hello, ${helloObject}!"     /> <#-- doesn't work -->
<#assign greeting="Hello, ${@helloObject}!"    /> <#-- doesn't work -->
<#assign greeting="Hello, ${<@helloObject/>}!" /> <#-- doesn't work -->
<#assign greeting="Hello, @helloObject!"       /> <#-- doesn't work -->
${greeting}
Run Code Online (Sandbox Code Playgroud)

Ria*_*ian 6

是的你可以。

<#宏helloObject>
  世界
</#宏>

<#assign x><@helloObject/></#assign>

你好 ${x}。

将打印:

你好,世界。


Tom*_*lst 5

您正在寻找一个函数

<#function helloObject>
  <#return "World">
</#function>

${helloObject()} <#-- Will print out World -->    

<#assign greetings = "Hello, " + helloObject() />

${greetings} <#-- Will print out Hello, World --> 
Run Code Online (Sandbox Code Playgroud)

无法分配宏的结果,因为它是模板片段。

  • 宏的结果不能(容易)赋值的原因是它就像某些语言中的函数 VS 过程;旨在为它们的副作用调用的宏(其中之一是打印到输出流)。但实际上可以将捕获的宏的输出分配给变量,但这是不好的做法,因为这样很容易弄乱自动转义(`&lt;@...&gt;` 永远不会转义,因为它意味着输出标记,但是` ${someCapturedOutput}` 会自动转义)。 (2认同)