다음 두 가지가 어떻게 다른지 설명해 주실 수 있나요?
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]
. 마찬가지로 is 일 [10,20,10]
때 두 번째 호출에서 가져옵니다 .[f]
[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]]
입력 배열로 사용하고 [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 ]