给定生成器为空时reduce和foreach之间的差异

时间:2019-05-20 16:51:43

标签: iteration jq

我写了以下命令:

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的身边。

我找不到这种差异的任何解释,也没有想到一个有意义的解释。你们可以帮助我理解为什么生成器为reduceforeachempty的行为不同吗?

1 个答案:

答案 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)