在各种网页中,我看到对带有斜杠的jq函数的引用以及跟随它们的数字。例如:
walk/1
我在stackoverflow页面上找到了上述符号。
我在jq Manual页面中找不到这个符号含义的定义。我猜它可能表明walk
函数需要1个参数。如果是这样,我想知道为什么没有使用更有意义的符号,例如在C ++,Java和其他语言中使用签名:
<function>(type1, type2, ..., typeN)
任何人都可以确认符号<function>/<number>
的含义吗?是否使用了其他变体?
答案 0 :(得分:3)
符号name / arity给出函数的名称和arity。 “arity”是参数的数量(即参数),因此例如explode / 0意味着你只需要编写explode
而没有任何参数,map / 1意味着你要编写类似{{1}的东西}。
通过名称调用0-arity函数而没有任何括号的事实使得符号特别方便。函数名称在任何时候都可以有多个定义(每个定义具有不同的arity)这一事实使得很容易区分它们。
这种表示法不用于jq程序,但它用于(新)内置过滤器map(f)
的输出。
相比之下,在其他一些编程语言中,它(或一些密切的变体,例如模块:Erlang中的name / arity)也是该语言的一部分。
当试图移植一种适用于语言的符号时,通常会出现各种困难,其中方法调度基于类型,其中调度仅基于arity。
如前所述,第一个与0-arity函数有关。这对于jq尤其有问题,因为在没有括号的jq中调用了0-arity函数。
第二个是,通常,jq函数不要求它们的参数是任何一个jq类型。必须编写类似builtins/0
而不仅仅是nth(string+number)
之类的东西,充其量只是单调乏味。
这就是为什么手册极力避免使用“名称(类型)” - 样式表示法。因此,我们会看到nth/1
,而不是startswith(str)
。也就是说,文档中的参数名称显然只是名称,当然它们通常会提供强大的类型提示。
如果您想知道为什么手册中没有记录'name / arity'约定,那可能主要是因为文档主要是在jq支持的多功能函数之前编写的。
总之 - 任何符号方案都可以起作用,但startswith(string)
是(1)简洁; (2)在jq环境中精确; (3)易学; (4)广泛用于面向文明的语言,至少在这个星球上。