替代运算符的奇怪行为 //

问题描述 投票:0回答:2

使用 JQ 1.5 我在理解特定情况下替代运算符

//
的输出时遇到问题。

鉴于此输入:

{
    "a": 42,
    "b": false,
    "c": null
}

我期望表达式

(.a, .b, .c, .d) // -1
返回这个:

42
-1
-1
-1

但实际上它返回的是这个:

42

如果我将

//
替换为
<
等另一个运算符,那么我确实会得到四个结果,而不是只有一个(实际结果在这里并不重要,只是它们的数量):

> jq '(.a, .b, .c, .d) < -1' input.json
false
true
true
true

注意: 表达式

(.a, .b, .c, .d) | . // -1
返回预期输出。这不是问题。我想知道为什么初始表达式不起作用。

jq semantics
2个回答
1
投票

坦率地说,1.5 文档是错误的。

jq FAQ 提供了这个简洁且有用的总结:

"A // B" either produces the truthy elements of A if there are any,
or else the entire stream B.

1
投票

在发布我的问题后,我偶然发现了开发人员版本手册中的确切答案。 :耸肩:

到目前为止,jq 1.5的手册页介绍了

//

如果 a 产生除

a // b
a
以外的结果,
false
形式的过滤器会产生与
null
相同的结果。否则,
a // b
会产生与
b
相同的结果。

开发者版本还说

[...]注意:

some_generator // defaults_here
some_generator | . // defaults_here
不同。后者将为左侧的所有非
false
、非
null
值生成默认值,而前者则不会。 [...] 在
(false, null, 1) | . // 42
中,
//
的左侧是
.
,它总是只产生一个值,而在
(false, null, 1) // 42
中,左侧是三个值的生成器,并且因为它产生其他
false
null
的值,不产生默认的
42

© www.soinside.com 2019 - 2024. All rights reserved.