您能向我解释一下以下两者有何不同吗?
jq ´def addvalue(f): . + [f]; map(addvalue(.[0]))´
[[1,2],[10,20]]
=> [[1,2,1], [10,20,10]]
jq ´def addvalue(f): f as $x | map(. + $x); addvalue(.[0])´
[[1,2],[10,20]]
=> [[1,2,1,2], [10,20,1,2]]
谢谢。
答案1
摘要: 这两个函数以及调用它们的方式的不同之处在于map()
操作发生的位置以及加法中使用的内容。这很重要,因为在第一种情况下,map()
调用中的 使函数中的加法使用第一个元素每个单独的子阵列输入数组的。第二种情况,map()
在函数内部执行,加法是使用整个第一个子数组输入数组的。
在第一个函数中,
def addvalue(f): . + [f];
您将该数组添加到[f]
假定为输入流中的数组的位置。将一个数组添加到另一个数组具有将新元素追加到该数组的效果。
您可以使用;调用此addvalue()
函数两次map()
每个数组[1,2]
和一次[10,20]
。在第一次调用中,[f]
will 是[1]
,因此您将1
其作为新元素添加到第一个数组中,产生[1,2,1]
。同样,您可以[10,20,10]
从第二次调用中得到 time [f]
is [10]
。
添加调试功能,
def addvalue(f): debug | . + [f]
当按照问题中的方式调用它时,我们得到以下结果:
["DEBUG:",[1,2]]
["DEBUG:",[10,20]]
这表明该函数被调用了两次。该值[f]
将[1]
在第一次调用中,产生操作[1,2] + [1]
,给出[1,2,1]
,[10]
在第二次调用中,[10,20] + [10]
产生[10,20,10]
。map()
调用中的操作会将这些数组组合成[[1,2,1],[10,20,10]]
.
在函数中
def addvalue(f): f as $x | map(. + $x);
您调用map()
输入流中假定为数组的内容。对于输入数组中的每个元素,添加$x
到该元素。的值$x
是数组的第一个元素。
您可以使用数组[[1,2],[10,20]]
作为输入数组并使用 with[1,2]
作为参数调用此函数一次。对于输入数组的每个元素,即对于[1,2]
和[10,20]
,您添加[1,2]
( 的值$x
,数组的第一个元素)。将一个数组添加到另一个数组会产生将数组的元素相互附加的效果,因此最终会得到[1,2,1,2]
和[10,20,1,2]
作为结果数组的两个元素。
以与第一个函数类似的方式在第二个函数中启用调试,
def addvalue(f): debug | f as $x | map(. + $x);
我们得到输出
["DEBUG:",[[1,2],[10,20]]]
这表明该函数被调用了一次。该map()
操作将创建一个数组,其中输入数组的每个元素都已[1,2]
添加到自身,并给出[[1,2,1,2],[10,20,1,2]]
结果。
要使第一个函数充当第二个函数,您必须使用以下方式调用它
.[0] as $x | map(addvalue($x[]))
要使第二个函数充当第一个函数,您必须将其称为
[ .[] as $x | [$x] | addvalue([$x[0]]) | add ]