Apache Velocity占位符插值

时间:2019-06-07 13:42:25

标签: apache interpolation velocity

也许是因为这是英国的星期五下午,而我的大脑决定放慢周末的热切期待,但是我让自己与Apache Velocity陷入了困境,我希望你们中的一个很可爱互联网上的人们将能够再次使我的大脑重新跳起来。

我疯狂的用例如下:

/**
 * @return int maximum memory limit in [byte]
 */
private static function takeMaximumFootprint()
{
    $memory = ini_get('memory_limit');
    $byte = intval($memory);
    $unit = strtolower($memory[strlen($memory) - 1]);
    switch ($unit) {
        case 'g':
            $byte *= 1024 * 1024 * 1024; break;
        case 'm':
            $byte *= 1024 * 1024; break;
        case 'k':
            $byte *= 1024; break;
    }

    return $byte;
}

我有一个用于循环访问列表的for循环,然后针对该列表中的每个项目调用一个自定义指令,该指令采用一个参数,该参数是循环索引构成一部分的预定义键。我将custom指令的结果设置为变量,以便可以在下一行使用它。

现在,我知道单引号(')内的所有内容均视为文字,而双引号(“)内的所有内容均已解析。所以我看到的是,当我在自定义指令,$ {foreach.index}尚未解析为值,而是被视为字符串文字。

在这种情况下,我为指令构造输入参数的正确方法是什么?

我正在使用Velocity 2.0版,但是可以根据需要进行升级或降级。

1 个答案:

答案 0 :(得分:1)

在星期五的下午,最好将评估分为两行:

#foreach( $item in $array )
    #set($arg = "a.key.with.the.${foreach.index}")
    #set($myVariable = "#foo($arg)")
#end

将一线客车停在星期一早上:

#foreach( $item in $array )
    #set($myVariable = "#foo(""a.key.with.the.${foreach.index}"")")
#end

基本原理是您需要两个级别的插值,因此需要转义(因此加倍)内部的双引号。