如何避免在 MarkLogic 中将地图作为参考传递?
How to avoid passing of map as reference in MarkLogic?
我正在使用 ML 8.0-8
有什么方法可以不将 Map 传递给函数作为引用。
我的意思是,如果我在函数中的地图中进行任何更新,它不应反映在实际地图中。
示例:
function call($map as map:map) {
'add one more key in the $map'
}
declare $actualMap
call($actualMap)
print $actualMap
调用函数中的更新不应反映在 $actualMap
中
您基本上必须克隆它。您可以在 XQuery 中使用 one-liner 序列化和解析它来做到这一点:
let $clonedMap := map:map(document{ $map }/*)
请注意,map:map
可能包含无法序列化的项目,例如函数引用。在这种情况下,您需要重建 map:map
。例如:
let $clonedMap := map:new(map:keys($map) ! map:entry(., map:get($map, .)))
第二种方法实际上可能更快,但它不会递归处理 map:map,而第一种方法会。您可以将第二个包装在递归函数中,并使用类型开关进行补偿。
HTH!
我正在使用 ML 8.0-8
有什么方法可以不将 Map 传递给函数作为引用。
我的意思是,如果我在函数中的地图中进行任何更新,它不应反映在实际地图中。
示例:
function call($map as map:map) {
'add one more key in the $map'
}
declare $actualMap
call($actualMap)
print $actualMap
调用函数中的更新不应反映在 $actualMap
中您基本上必须克隆它。您可以在 XQuery 中使用 one-liner 序列化和解析它来做到这一点:
let $clonedMap := map:map(document{ $map }/*)
请注意,map:map
可能包含无法序列化的项目,例如函数引用。在这种情况下,您需要重建 map:map
。例如:
let $clonedMap := map:new(map:keys($map) ! map:entry(., map:get($map, .)))
第二种方法实际上可能更快,但它不会递归处理 map:map,而第一种方法会。您可以将第二个包装在递归函数中,并使用类型开关进行补偿。
HTH!