kdb+/q:检查参数是否已提供给函数调用
kdb+/q: Check if argument has been supplied to the function call
假设我们有两个参数的函数 fun
,第二个参数是可选的。
如何在函数内检查是否提供了第二个可选参数并采取相应措施?
fun: {[x;optarg] $["optarg was supplied" like "optarg was supplied";"behavior 1"; "behavior 2"] }
fun[1;2] / behavior 1
fun[1] / behavior 2
```
我认为这是不可能的。提供少于指定数量的参数会导致 projection.
一个很好的选择是让你的函数接受一个参数——一个列表。然后你可以检查列表中的每个元素是否存在。
f:{[l] $[1=count[l];
/ do something with first arg only;
/ do something with both args ]
}
或者您可以让函数接受字典(这允许您在函数中设置默认值)。
q)f:{[dict] def:`a`b`c!10 20 30;
def:def upsert dict;
:def[`a] + def[`b] + def[`c] }
q)f[`a`b!5 10]
45
q)f[`a`c!5 10]
35
您无法检查参数数量,当参数数量超过预期时,kdb+ 将报告 rank
错误。但是有一个解决方法会导致函数接受 any 个参数:
q)func:('[{$[1=count x;"one";"more"]};enlist])
q)func[1]
"one"
q)func[1;2]
"more"
q)func[1;2;3]
"more"
这是一个例子:
q)func:('[{$[1=count x;x[0];sum x]};enlist])
q)func[1]
1
q)func[1;2]
3
q)func[1;2;4]
7
q)func[1;2;4;7]
14
func:('[{
inputs:(`a_Required`b_Required`c_Optional`d_Optional);
optionalDefaults:`c_Optional`d_Optional!(0b;1b);
if[(count inputs)<count x;-1"Too Many input arguments";:()];
data:inputs xcols optionalDefaults, (!) . (numInputs:count x)#'(inputs;x);
show data;
data
};enlist]
)
假设我们有两个参数的函数 fun
,第二个参数是可选的。
如何在函数内检查是否提供了第二个可选参数并采取相应措施?
fun: {[x;optarg] $["optarg was supplied" like "optarg was supplied";"behavior 1"; "behavior 2"] }
fun[1;2] / behavior 1
fun[1] / behavior 2
```
我认为这是不可能的。提供少于指定数量的参数会导致 projection.
一个很好的选择是让你的函数接受一个参数——一个列表。然后你可以检查列表中的每个元素是否存在。
f:{[l] $[1=count[l];
/ do something with first arg only;
/ do something with both args ]
}
或者您可以让函数接受字典(这允许您在函数中设置默认值)。
q)f:{[dict] def:`a`b`c!10 20 30;
def:def upsert dict;
:def[`a] + def[`b] + def[`c] }
q)f[`a`b!5 10]
45
q)f[`a`c!5 10]
35
您无法检查参数数量,当参数数量超过预期时,kdb+ 将报告 rank
错误。但是有一个解决方法会导致函数接受 any 个参数:
q)func:('[{$[1=count x;"one";"more"]};enlist])
q)func[1]
"one"
q)func[1;2]
"more"
q)func[1;2;3]
"more"
这是一个例子:
q)func:('[{$[1=count x;x[0];sum x]};enlist])
q)func[1]
1
q)func[1;2]
3
q)func[1;2;4]
7
q)func[1;2;4;7]
14
func:('[{
inputs:(`a_Required`b_Required`c_Optional`d_Optional);
optionalDefaults:`c_Optional`d_Optional!(0b;1b);
if[(count inputs)<count x;-1"Too Many input arguments";:()];
data:inputs xcols optionalDefaults, (!) . (numInputs:count x)#'(inputs;x);
show data;
data
};enlist]
)