次の2つの違いを説明できますか?
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
要約:これら2つの関数の違いと呼び出し方法の違いは、タスクが発生map()
する場所と追加に使用されるものです。最初のケースでは、map()
make関数の追加が最初の要素を使用するため、これは重要です。各個別のサブ配列入力配列。 2番目のケースでは、map()
関数の内部で実行され、次を使用して追加が実行されます。完全な最初のサブ配列入力配列。
最初の関数では
def addvalue(f): . + [f];
[f]
入力ストリームの配列と見なされる項目に配列を追加します。ある配列を別の配列に追加すると、配列に新しい要素が追加される効果があります。
各配列に対してこのaddvalue()
関数を2回呼び出すことができます。最初の呼び出しでは、willはそのため、最初の配列に新しい要素として追加した結果です。同様に、2番目の通話から時間がわかります。map()
[1,2]
[10,20]
[f]
[1]
1
[1,2,1]
[10,20,10]
[f]
[10]
デバッグ機能を追加し、
def addvalue(f): debug | . + [f]
質問でこれを呼び出すと、次のような結果が得られます。
["DEBUG:",[1,2]]
["DEBUG:",[10,20]]
これは、関数が2回呼び出されたことを示しています。結果操作の最初の呼び出しと2番目の呼び出しで値が提供され[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]]
配列を入力配列として使用し、引数として使用して[1,2]
この関数を一度呼び出すことができます。入力配列の各要素に(つまり、[1,2]
およびの場合)(配列の最初の要素である値)を[10,20]
追加します。ある配列を別の配列に追加すると、配列内の要素が互いに追加される効果があるため、結果の配列の2つの要素でsumが生成されます。[1,2]
$x
[1,2,1,2]
[10,20,1,2]
最初の関数と同様に、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]]
結果が得られます。
最初の関数を2番目の関数として機能させるには、次のように呼び出す必要があります。
.[0] as $x | map(addvalue($x[]))
2番目の関数が最初の関数のように機能するようにするには、その関数を呼び出す必要があります。
[ .[] as $x | [$x] | addvalue([$x[0]]) | add ]