首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >幅度(2,5)和范围(2;5)之间的差异

幅度(2,5)和范围(2;5)之间的差异
EN

Stack Overflow用户
提问于 2020-11-13 20:38:33
回答 2查看 59关注 0票数 3

模板

range(2;5)

制作:

代码语言:javascript
运行
复制
2
3
4

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

代码语言:javascript
运行
复制
range(2, 5)

令人惊讶:

代码语言:javascript
运行
复制
0
1
0
1
2
3
4

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

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2020-11-13 21:00:25

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

通常,如果E/1使用与def E($x):等效的表单(即作为“常规”函数)定义,那么E(a,b)将发出流E(a),然后是流E(b)

事实上,range/1被定义为“正则函数”。

非正则函数

下面是一个非正则函数的例子:

代码语言:javascript
运行
复制
# Emit a single JSON object ("bow" is short for "bag of words")
def bow(stream): 
  reduce stream as $word ({}; .[($word|tostring)] += 1);

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

因为def E($x):等同于def E(x): x as $x,所以将bow定义为

代码语言:javascript
运行
复制
def bow($s): reduce $s as $word ({}; .[($word|tostring)] += 1);

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

票数 2
EN

Stack Overflow用户

发布于 2020-11-14 03:10:42

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

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

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

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/64827742

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档