4


1

NVelocityのforループ

NVelocityは#forループをサポートしていますか? 私はドキュメントを調べましたが、見つけられたのは#foreachループだけでした。

2次元配列をループします。

3 Answer


10


foreachループで範囲演算子 `[n..m]`を使用して、通常のループをエミュレートできます。 `$ array [n] [m]`のような通常の方法で多次元配列要素にアクセスすることもできます。

たとえば、そのような2D配列がある場合(Javaコードはごめんなさい):

String[][] testArray = new String[][] {{"a1","b1"},{"a2","b2"},{"a3","b3"}};

次のようにVelocityでループできます:

#set($sizeX = $testArray.size() - 1)
#set($sizeY = $testArray[0].size() - 1)
#foreach($i in [0..$sizeX])
    #foreach($j in [0..$sizeY])
        e[$i][$j] = $testArray[$i][$j]

    #end
#end

どの出力:

e[0][0] = a1
e[0][1] = b1
e[1][0] = a2
e[1][1] = b2
e[2][0] = a3
e[2][1] = b3

更新

changelogによれば、明らかに括弧で囲まれた構文はVelocity 1.7b1でのみ導入されました。 古いバージョンでは、Velocityの配列が(ArrayList)(Javaで)によってサポートされているため、ブラケットを `get(i)`に置き換えるだけで済みます。 だから、これはうまくいくはずです:

#set($sizeX = $testArray.size() - 1)
#set($sizeY = $testArray.get(0).size() - 1)
#foreach($i in [0..$sizeX])
    #foreach($j in [0..$sizeY])
        e[$i][$j] = $testArray.get($i).get($j)

    #end
#end


1


残念ながら、NVelocityは「そのまま」では* for ループをサポートせず、 foreach *のみをサポートします。 Castle Project’s forkでもforeachループのみが改善されています。

私の知る限り、.NETプロジェクトのNVelocityは行き詰まっています。 私たちはプロジェクトでそれを使用しています。lonely7345と同様のコードを使用してその欠点に対処しています。

ただし、http://www.west-wind.com/weblog/posts/2010/Dec/27/Hosting-the-Razor-Engine-for-Templating-in-NonWeb-Applications [Razorをスタンドアロンとして使用することを検討していますテンプレートエンジン] …​


0


Hashtable entries = new Hashtable(StringComparer.InvariantCultureIgnoreCase);
entries["listtool"] = new ListTool();
VelocityContext context = new VelocityContext(entries);

listtoolクラスでは、2次元配列のフェッチを完了するためのC#コードを記述します。

public Object get(Object list, int x,int  y)
    {
         return  ((IList)list)[x][y];
    }

$listtool.get($obj,x,y);