我在使用Velocity时遇到了一些使用键值映射的问题。
有人有这个功能的示例吗?
$myMap ={}
$myMap.put("mykey1", "myvalue")
$myMap.delete("mykey1")
$myMap.getValue("mykey1")
我在使用Velocity时遇到了一些使用键值映射的问题。
有人有这个功能的示例吗?
$myMap ={}
$myMap.put("mykey1", "myvalue")
$myMap.delete("mykey1")
$myMap.getValue("mykey1")
正如Nathan所说,你应该使用:
#set ($myMap = {})
创建一个新的Map并将其分配给一个变量。
现在,为什么会打印put
调用。
任何不在指令内部的内容(例如#set(not printed)
或#if(not printed)
或#foreach(again not printed)
),包括自由文本、变量和方法调用,都会被打印。
Velocity无法区分$myMap.get('mykey')
和$myMap.put('key', 'value')
(读者与写者之间的不同语义),因此put
调用的结果会被打印,就像其他任何方法一样。
每当某些东西无法正确评估时,因为未定义变量或沿着某条线路某个方法返回null
,导致无法评估的代码会被直接转储到输出中。
如put
方法的文档所述,该函数返回存储在该键下的上一个值,如果根本没有设置任何值,则返回null
。
总之,这行代码被打印是很正常的。
要尝试这个理论,您可以这样做:
#set ($myMap = {})
$myMap.put('key', 'first value')
$myMap.put('key', 'second value')
$myMap.get('key')
这将被打印出来:
$myMap.put('key', 'first value')
first value
second value
有两种方法可以使该行不被打印:
将函数的结果存储在一个临时变量中:#set ($discard = $myMap.put('key', 'value')
使用silent方法调用:$!myMap.put('key', 'value')
我建议使用第一种方法,因为当您替换现有值时,第二种方法仍然会打印一些内容。
您尝试过执行以下操作吗:
#set( $myMap = {} )
同样,确保您使用的是现代版本的Velocity。古老的版本在VTL中没有地图语法。
只需在代码中添加!即可不打印输出: $!myMap.put('key', 'second value')
#if ($myMap.put('key', 'value'))#end
。 - gknicker#if ($myMap.put('key', 'value'))#end
#if ($myMap.put('key', 'value'))#end