您能向我解釋一下以下兩者有何不同嗎?
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 ]