2016-04-20 22 views
1

は、インスタンス最小の引数

<#macro m a b c...> 

のためにあなたは、マクロの呼び出し中に3つの引数または2の最小値を渡す必要がありますか?パラメータcは少なくとも1つの値を持っていなければなりませんか?また、デフォルトでnullとしてパラメータを指定する方法はありますか?

答えて

0

マクロで可変パラメータを使用する場合は、最後の引数に値を渡す必要はありません。例えば

<#macro m a b c...> 
    a = ${a!} 
    b = ${b!} 
    <#list c?keys as attr> 
    ${attr} = ${c[attr]} 
    </#list> 
</#macro> 

<@m a='A' b='B' /> 

<@m a='A' b='B' c='C' d='D'/> 

ウィル出力:

a = A 
b = B 


a = A 
b = B 
c = C 
d = D 
5
<#macro name param1 param2 ... paramN> 
    ... 
    <#nested loopvar1, loopvar2, ..., loopvarN> 
    ... 
    <#return> 
    ... 
</#macro> 

  • 名:マクロ変数の名前。それは表現ではありません。これは、myMacroや my-macroなど、トップレベルの変数参照と同じ構文で、 に従います。しかし、 は、マクロ名に を識別子で指定できない文字が含まれている場合に便利です。たとえば、< #macro "foo〜bar"> ....注釈 この文字列リテラルが補間を展開しないことを示します( "$ {foo}")。
  • param1、param2、...など:ローカル変数の名前には、 のパラメータ値(式ではない)が格納され、オプションで=およびその後のデフォルト値(式)です。デフォルト値は の別のパラメータでもあります。例えば、< #macro section title label = title>です。 パラメータ名には、トップレベル変数 の参照と同じ構文が使用されているため、同じ機能と制限が適用されます。
  • paramNの場合、最後のパラメータに任意に3つの末尾のドット(...)がある場合は の可変数のマクロを使用することを示す があり、他のパラメータと一致しないパラメータは になります最後のパラメータ(catch-all パラメータとも呼ばれます)。名前付きパラメータでマクロを呼び出すと、paramN は、宣言されていないすべてのキーと値のペア がマクロに渡されたハッシュになります。位置 のパラメータを使用してマクロを呼び出すと、paramNは余分なパラメータ の値のシーケンスになります。 (ケースだった見つけるために、マクロの中で、あなたが myCatchAllParamを使用することができますか?is_sequence。)

したがって、マクロがNパラメータを取るために任意の制限はありません見ることができるように。

この構造体は、(名前空間機能を知っている場合は、現在の名前空間に)マクロ変数を作成します。マクロを初めて使用していて、user-defined directivesの場合は、ユーザー定義ディレクティブのチュートリアルをお読みください。

マクロ変数には、ユーザ定義ディレクティブとして使用できるテンプレートフラグメント(マクロ定義ボディ)が格納されます。変数には、ユーザー定義ディレクティブに許可されたパラメータの名前も格納されます。 変数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/> 

出力:

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

出力:

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があります:

null参照設計によってFreeMarkerのエラーです。カスタムnull値(文字列)を定義することは、あなたが言及した理由のためには良い考えではありません。以下の構築物は、代わりに使用する必要があります。

  • マクロや関数のパラメータは 発信者は変数がnullであるかどうかを確認するには、彼らに
  • を省略することができますので、あなたが使用する必要があり、デフォルト値を持つことができます?演算子:< #if (名前??)>
  • nullにすることができる変数を使用する場合は、!デフォルト値を指定する オペレータ:名 "いいえ名"
  • 配列(または文字列)が空の場合has_content 組み込み使用し、チェックするには、次の!?<の#if(?名has_contentを)>

マクロでデフォルトのパラメータ値として空のシーケンスを指定し、空であるかどうかをテストすることができます。

+0

私はあなたが答えるために時間を割いて感謝し、私はFreeMarkerの –

+0

@AnnMathewsのマクロについて話しているはい、私はそれを修正しました、それはあなたのために役立つことを願っています – Ssein

+0

私はあなたの答えに 'paramN'のような可変パラメータを持っていれば、その値を与える必要がありますか?あるいは、それを無視することはできますか? –