我写了以下命令:
jq -n 'reduce empty as $e (0; .)'
jq -n 'foreach empty as $e (0; .; .)'
并且我期望两者都不产生任何结果(或者0,我期望这些相似结构之间的一致性)。但是相反,我得到了不一致的结果。
$ jq -n 'reduce empty as $e (0; .)'
0
$ jq -n 'foreach empty as $e (0; .; .)'
$
手册说:
空不返回任何结果。一个都没有。甚至都不为空。有时很有用。您会知道是否需要它:)
我这样解释,就像是一个吸收所有东西的黑洞(我可能错了)。但是当它用作生成器时,reduce
会通过其初始值,而foreach
不会。我不知道哪个人在逻辑上行事,但我在foreach
的身边。
我找不到这种差异的任何解释,也没有想到一个有意义的解释。你们可以帮助我理解为什么生成器为reduce
时foreach
和empty
的行为不同吗?
答案 0 :(得分:3)
减少只是给定集合的减少功能。给定一个初始种子,它将更新每个值的值并返回最终结果。
Foreach与reduce相似,但不同之处在于它不返回最终结果,而是返回每个值的所有中间结果。
由于在foreach调用中未进行任何迭代,因此不会生成任何结果。另一方面,Reduce也没有迭代,因此不对初始种子(0
)进行任何更改,然后将其返回。
如果有帮助,它与以下python代码等效:
def reduce(in, get_items, get_seed, update):
current = get_seed(in)
for item in get_items(in):
current = update(current, item)
return current
def foreach(in, get_items, get_seed, update, extract):
current = get_seed(in)
for item in get_items(in):
current = update(current, item)
yield extract(current, item)