13

我在 Velocity 中使用键值映射时遇到了一些问题。

有人有这个功能的例子吗?

$myMap ={}

$myMap.put("mykey1", "myvalue")
$myMap.delete("mykey1")
$myMap.getValue("mykey1")
4

2 回答 2

21

正如内森所说,你应该使用:

#set ($myMap = {})

创建一个新地图并将其分配给一个变量。

现在,为什么要put打印呼叫。

  1. 任何不在指令内的内容,例如#set(not printed)or#if(not printed)#foreach(again not printed),都会被打印出来,包括自由文本、变量和方法调用

  2. Velocity 无法区分$myMap.get('mykey')and $myMap.put('key', 'value')(reader vs. writer) 的不同语义,所以put会打印调用的结果,就像任何其他方法一样。

  3. 每当由于未定义变量或方法返回的某处而无法正确评估某些内容时null,无法评估的代码将按字面意思转储到输出中。

  4. 正如该put方法的文档所述,该函数返回为该键存储的先前值,或者null根本没有设置任何值。

  5. 综上所述,打印该行是正常的。

要尝试这个理论,你可以这样做:

#set ($myMap = {})
$myMap.put('key', 'first value')
$myMap.put('key', 'second value')
$myMap.get('key')

这将被打印:

$myMap.put('key', 'first value')
first value
second value

您可以做两件事来避免打印该行:

  1. 将函数的结果存储在临时变量中:#set ($discard = $myMap.put('key', 'value')

  2. 使用静默方法调用:$!myMap.put('key', 'value')

我推荐第一个,因为当您替换现有值时,第二个仍然会打印一些东西。

于 2013-05-19T01:21:55.980 回答
3

Did you try doing:

#set( $myMap = {} )

Also, make sure you are using a modern version of Velocity. Ancient ones did not have map syntax in VTL.

于 2013-05-06T15:38:01.863 回答