kdb和x2B/q:检查函数调用是否提供了参数

kdb和x2B/q:检查函数调用是否提供了参数,kdb,q-lang,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 ```我认为这是不可能的。提供少于指定数量的参数会导致错误 一个好的替代方法是让函数接受一个参数——一

假设我们有两个参数的函数
fun
,第二个参数是可选的。 如何在函数中检查是否提供了第二个可选参数并相应地执行操作

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

```我认为这是不可能的。提供少于指定数量的参数会导致错误

一个好的替代方法是让函数接受一个参数——一个列表。然后可以检查列表中每个元素是否存在

f:{[l] $[1=count[l]; 
             / do something with first arg only; 
             / do something with both args ] 
}
或者,您可以让函数接受字典(这允许您在函数中设置默认值)


无法检查参数数量,当参数数量超出预期时,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
func:('[{
输入:(`a_必需`b_必需`c_可选`d_可选);
可选默认值:`c_Optional`d_Optional!(0b;1b);

如果[(计算输入)同样,谷歌小组最近也提出了同样的问题,结论与下面的jgleeson的结论相同。如果你不是该小组的成员,你应该加入该小组,k4列表框也是如此
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