scala - 为什么在scala中将部分函数用作参数时不需要括号?
问题描述
我发现在Scala中将部分函数用作参数时不需要括号
val array = Array(2)
array.map(x => x + 1)
array.map { case x => x + 1 }
{ case x => x + 1 }
这里定义了一个偏函数,所以应该是array.map({ case x => x + 1 })
,但是没有括号。那么这里发生了什么?这里有什么句法?
解决方案
答案在语言规范中。函数应用程序的语法是这样的:
SimpleExpr ::= SimpleExpr1 ArgumentExprs
ArgumentExprs ::= ‘(’ [Exprs] ‘)’
| ‘(’ [Exprs ‘,’] PostfixExpr ‘:’ ‘_’ ‘*’ ‘)’
| [nl] BlockExpr
Exprs ::= Expr {‘,’ Expr}
因此,函数的参数可以是一个或多个由 包围的表达式(
)
,或者BlockExpr
如果函数采用单个参数,则可以是单个表达式。
继续关于块的部分,我们发现:
BlockExpr ::= ‘{’ CaseClauses ‘}’
| ‘{’ Block ‘}’
Block ::= BlockStat {semi BlockStat} [ResultExpr]
部分函数是使用该CaseClauses
选项定义的,因此必须将它们括起来{
}
才能形成块表达式。然后,此块表达式是具有单个参数的函数的有效参数。
接受多个参数的函数必须始终使用(
)
.
推荐阅读
- python - 如何垂直合并两个csv文件并保持数据格式(数字到数字,字符串到字符串)
- javascript - 我在 componentDidMount 中卸载什么
- bash - 如何检查文件是否为 ascii 文本文件 - BASH SCRIPT
- javascript - location.hash = window.location.hash 在 Chrome 中不起作用
- javascript - 在这种情况下,v-if 的另一种解决方案是什么?
- python - 编写函数 is_valid_date(month, day, year) 接受月、日、年的参数
- c++ - 如何在 OpenGL 中创建“凹/凸圆错觉”
- javascript - 添加附加功能以退出页面弹出消息
- android - 如果我向片段 backstack 添加一个新事务(添加片段,不删除),是否复制或使用先前事务中的片段对象
- reactjs - React Native numberOfLines 无效的 props.style 键