kdb + / q:检查参数是否已提供给函数调用

时间:2015-04-17 16:38:14

标签: kdb q-lang

假设我们有两个参数的函数fun,第二个是可选的。 如何在函数内检查是否已提供第二个可选参数并采取相应措施?

fun: {[x;optarg] $["optarg was supplied" like "optarg was supplied";"behavior 1"; "behavior 2"] }
fun[1;2] / behavior 1
fun[1]   / behavior 2

```

3 个答案:

答案 0 :(得分:6)

我不认为这是可能的。提供少于指定数量的参数会产生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

答案 1 :(得分:1)

您无法检查参数的数量,当参数数量超过预期时,kdb +将报告rank错误。但是有一种解决方法会导致函数接受任何个参数:

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

答案 2 :(得分:0)

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]
     )