假设我创建了一张地图:
let $map := map:map()
如何在不使用let
的情况下在地图中放置内容?通常我必须做像
let $map := map:map()
let $useless-var := map:put($map, $key, $value)
似乎奇怪的是,如果我想执行某些操作并且我不关心返回值,我仍然需要存储结果。我在这里缺少什么?
注意:重要的部分不是map(),而是我不能运行函数而不将结果存储在某个无意义的变量中。
答案 0 :(得分:2)
一种方法是将函数作为序列中的项执行,其中序列中只有一个项(通常是第一个或最后一个)为赋值或返回提供实际值,如:
let $roundedX := (
math:floor($x),
local:function1(...),
local:function2(...)[false()],
...
)
...
return (
local:functionA(...),
local:functionB(...)[false()],
...,
$roundedX * 10
)
如果函数返回一个你要丢弃的值,只需使用一个假谓词,就像上面的两个函数一样。
当然,这种方法仅适用于有副作用的功能。
答案 1 :(得分:1)
除非您需要,否则不要使用FLWOR。在我看来,FLWOR表达式有些过度使用。我经常看到如下表达式:
let $a := current-time()
return $a
......什么时候写得好:
current-time()
另请参阅:http://blakeley.com/blogofile/2012/03/19/let-free-style-and-streaming/
答案 2 :(得分:0)
在MarkLogic 7中,您可以使用地图构造函数以递归方式生成地图。我想这可能是你想要的:
let $map := map:new(
(1 to 10) ! map:entry(., .)
)
或者您执行map:put
作为另一个序列的一部分,或者在返回地图之前在return语句中执行:
let $map := map:map()
let $not-useless-var := ...
return (map:put($map, string($not-useless-var), $not-useless-var), $map)
答案 3 :(得分:0)
在简单的XQuery中(忽略像XQuery scripting extension这样的扩展)没有副作用,所以在不使用返回值的情况下调用函数是没有意义的。
您可能缺少的是map:put()
返回新地图并添加了额外的项目,不会改变原始地图。所以你的$useless-var
实际上并没用。
编辑:其实我不确定MarkLogic的map:put()
是否会改变地图。 (如果确实如此,那真的很糟糕。)我在考虑提出的XQuery 3.1地图(我在BaseX中使用过),这绝对是不可变的。
答案 4 :(得分:0)
由于您的问题的焦点是关于在不存储中间结果的情况下运行函数,您可能会发现地图运算符(!)有用:
local:build-sequence() ! local:do-something-to-each(.)
这对处理序列很有用。如果你正在考虑更多地处理某些事情的结果,那么答案可能就是接受XQuery的功能性:
local:produce-result(
local:build-parameter(),
local:retrieve-config()
)
不确定您正在寻找什么,但希望这些帮助。