【问题标题】:difference between range(2,5) and range(2;5)range(2,5) 和 range(2;5) 之间的区别
【发布时间】:2020-11-13 20:38:33
【问题描述】:

模板

range(2;5)

制作:

2
3
4

这不是很有趣,因为这是由手册解释的。但是对于命令式程序员来说只是时间问题,他会错误地用逗号分隔参数(实际上我看错了手册,所以这是我的第一次尝试),然后尝试模板:

range(2, 5)

令人惊讶:

0
1
0
1
2
3
4

那是什么?它是如何定义/解释的?

【问题讨论】:

    标签: function syntax jq


    【解决方案1】:

    “逗号”运算符(如2,5)产生一个流。所以2,5 发出两个整数,这就是为什么[2,5] 计算为一个由两个整数组成的数组。

    一般来说,如果E/1 已使用与def E($x): 等效的形式定义(即,作为“常规”函数),则E(a,b) 发出流E(a),后跟流E(b)

    确实range/1 已被定义为“常规函数”。

    非常规函数

    下面是一个非常规函数的例子:

    # Emit a single JSON object ("bow" is short for "bag of words")
    def bow(stream): 
      reduce stream as $word ({}; .[($word|tostring)] += 1);
    

    请注意,这里的函数参数 (stream) 被传递给 reduce,它当然会以特殊方式处理其第一个参数。

    由于def E($x): 等价于def E(x): x as $x,将bow 定义为

    def bow($s): reduce $s as $word ({}; .[($word|tostring)] += 1);
    

    会有完全不同(且无用)的语义。

    【讨论】:

      【解决方案2】:

      peak 的答案是正确的,但我觉得它掩盖了答案的最基本部分......逗号根本不用于分隔 jq 中的函数 args,因为它“已经被采用”并且 jq 几乎没有语法重载.

      因为所有函数都隐含地接受一个流(输入为.)并计算为一个流,所以大量函数在语法上是 0-adic(例如tostring),其余大部分在语法上是 1 -adic(例如split(str),它将分隔符作为参数,并且使用该分隔符隐式拆分值)。对于像 rangesub 这样需要多个显式参数的罕见函数,使用分号而不是逗号作为分隔符。

      而且由于 jq 不是一种面向语句的语言,这 几乎 是分号的唯一用途。它唯一出现的其他地方是标记函数定义的结束,这不会引起太多混乱。

      【讨论】:

      猜你喜欢
      • 2010-10-17
      • 2019-01-23
      • 1970-01-01
      • 1970-01-01
      • 2014-11-26
      • 1970-01-01
      • 2012-02-20
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多