以下(https://jqplay.org/s/9r9oTh1VFq)
filter:
def addvalue(f): map(. f); addvalue(.[0])
input:
[[1,2],[10,20]]
給出錯誤:
jq: error (at <stdin>:0): array ([1,2]) and number (1) cannot be added
exit status 5
但是這個(https://jqplay.org/s/X7FDfQWubV)
filter:
def addvalue(f): map(. f); addvalue([1,2])
input:
[[1,2],[10,20]]
output:
[
[
1,
2,
1,
2
],
[
10,
20,
1,
2
]
]
按預期作業。
從 jq 手冊中,以下(https://jqplay.org/s/npl2nalQyq)也有效:
filter:
def addvalue($f): map(. $f); addvalue(.[0])
input:
[[1,2],[10,20]]
output:
[
[
1,
2,
1,
2
],
[
10,
20,
1,
2
]
]
在 jq 手冊中它說:
If you want the value-argument behaviour for defining simple functions, you can just use a variable...
為什么我需要使用$f函式定義中的變數addvalue(.[0])才能作業?
謝謝!
uj5u.com熱心網友回復:
函式引數是過濾器,在函式體中使用時將接受輸入并產生輸出。
要“傳遞”一個值,您可以立即“使用”過濾器并將其分配給一個變數
def addvalue(f): f as $f | map(. $f)
你可以用速記寫
def addvalue($f): map(. $f)
沒有變數,過濾器.[0]用于呼叫map
map(. .[0])
例如,您現在將嘗試在其中添加[1,2]and1而不是預期的[1,2] [1,2]. 也就是說,.[0]引數沒有被“評估”以產生傳遞給函式的值;過濾器本身作為引數傳遞,直到map被呼叫才實際使用。
uj5u.com熱心網友回復:
結果是不同的,因為.[0]根據正在評估的背景關系具有不同的值。
在您的第一個示例中,該函式的引數是一個過濾器,并且使用一個也是過濾器的引數呼叫它。因此,僅在函式的引數為??時才評估引數過濾器。這個“后期”背景關系是主要輸入的陣列元素。總體評價如下:
[[1,2], [10,20]] | def addvalue(f): map(. f); addvalue(.[0])
[[1,2], [10,20]] | map(. .[0])
[[1,2] .[0], [10,20] .[0]]
[[1,2] 1, [10,20] 10]
jq: error (at <stdin>:0): array ([1,2]) and number (1) cannot be added
exit status 5
在您的第二個示例中,函式的引數仍然是一個過濾器,但它是用一個現在是一個值的引數呼叫的。因此,即使函式的引數被延遲評估,它也會被提供在頂層定義的不變的常量值。總體評價如下:
[[1,2], [10,20]] | def addvalue(f): map(. f); addvalue([1,2])
[[1,2], [10,20]] | map(. [1,2])
[[1,2] [1,2], [10,20] [1,2]]
[[1,2,1,2], [10,20,1,2]]
在您的第三個示例中,函式的引數是一個變數,并且使用一個作為過濾器的引數呼叫它。因此,要設定函式的引數變數,必須立即評估引數過濾器。這個“早期”背景關系是主要輸入。總體評價如下:
[[1,2], [10,20]] | def addvalue($f): map(. $f); addvalue(.[0])
[[1,2], [10,20]] | def addvalue($f): map(. $f); addvalue([1,2])
[[1,2], [10,20]] | map(. [1,2])
[[1,2] [1,2], [10,20] [1,2]]
[[1,2,1,2], [10,20,1,2]]
uj5u.com熱心網友回復:
這是對 pmf 出色答案的一點說明。
對于第一個例子
[[1,2], [10,20]] | def addvalue(f): map(. f); addvalue(.[0])
[[1,2], [10,20]] | map(. .[0])
[([1,2] | . .[0]), ([10,20] | . .[0])]
[[1,2] 1, [10,20] 10]
jq: error (at <stdin>:0): array ([1,2]) and number (1) cannot be added
exit status 5
我只是澄清了背景關系。
轉載請註明出處,本文鏈接:https://www.uj5u.com/net/435621.html
上一篇:變數I=i 1弄亂了代碼的一部分(行數-4)如何忽略這部分的變數?[復制]
下一篇:盡管coffee_machine是一個全域變數,為什么我得到“分配前參考的UnboundLocalError區域變數‘coffee_machine’”?[復制]
