如何在递归宏中更改参数变量值?

时间:2014-01-23 03:00:10

标签: freemarker

我想以黑色显示数字序列,并以红色显示嵌套序列号。这是我的marco代码:

<#macro test datas isNested>
    <#list datas as d>
    <#if d?is_enumerable>
        <#local isNested = true>
        <#if isNested>
            <#-- become red if it is nested -->
            Hi, I am going to be red!
                            <#-- some business code -->
        </#if>
        <@test d isNested/>
    <#else>
        <#if isNested>
            <span style="color:red;">${d}</span>
        <#else>
            ${d}
        </#if>
    </#if>
</#list>
</#macro>

这样称呼:

<@test [1,2,3,[4,5],6,7] false/>
我希望它是:
1 2 3 Hi, I am going to be red! 4 5 6 7
只有4和5显示为红色 但现在我明白了:

1 2 3 Hi, I am going to be red! 4 5 6 7

所有4 5 6 7都以红色显示。

我认为这行代码<#local isNested = true>起到了作用。我也尝试使用assignglobal,所有1 2 3 4 5 6 7都是黑色。

那我该怎么办? Thx提前。

PS
    我不知道如何在stackoverflow中以红色显示代码,如果有人知道plz帮助我编辑我的代码。

1 个答案:

答案 0 :(得分:1)

您的问题不是FreeMarker特有的。在递归isNested调用之前,将true局部变量(也包含参数值)翻转到@test,如果返回递归宏调用,则将其保留。因此,当67的迭代到来时,isNested已经true。您根本不应设置isNested,只需将true传递给递归调用即可。这里:

<#macro test datas isNested=false>
    <#list datas as d>
        <#if d?is_enumerable>
            Hi, I am going to be red!
            <@test d true />
        <#else>
            <#if isNested>
                <span style="color:red;">${d}</span>
            <#else>
                ${d}
            </#if>
        </#if>
    </#list>
</#macro>

<@test [1,2,3,[4,5],6,7] />