0

說我有一個FreeMarker的宏:是否可以插入freemarker宏?

<#macro helloObject> 
    World 
</#macro> 

我可以在某些情況下很容易地把它稱爲​​:

Hello, <@helloObject/>! 

但是,什麼是內插它,例如語法,如果它是一個字符串的一部分?

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

回答

4

您正在尋找function

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

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

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

${greetings} <#-- Will print out Hello, World --> 

無法分配宏的結果,因爲它是模板片段。

+2

宏的結果不能(容易)分配的原因是,它像功能VS某些語言的程序;宏意味着被稱爲他們的副作用(其中一個是打印到輸出流)。但實際上可以將捕獲到的宏輸出分配給一個變量,但這是一個糟糕的做法,因爲很容易搞砸自動轉義,然後('<@...>'因爲它意味着輸出標記而不會被轉義,但是'$ {someCapturedOutput}受自動轉義影響)。 – ddekany

+0

所以我在這裏遇到了一些困難。一方面,我認爲我想使用宏,因爲宏將主要輸出HTML(也許在那裏也有一點自由標記插值)。但另一方面,它使得使用函數更簡單。哪一個更糟糕 - 使用函數來編寫僅僅爲了副作用而調用的東西,或者將宏的輸出分配給變量? – brentonstrine

2

是的,你可以。

 
<#macro helloObject> 
    World 
</#macro> 

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

Hello ${x}. 

會打印:

 
Hello World. 
相關問題