当将部分函数用作scala中的参数时,为什么不需要括号?

时间:2019-01-17 03:09:19

标签: 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 }),但没有括号。那么这里发生了什么?这是什么语法?

1 个答案:

答案 0 :(得分:4)

答案在语言规范中。 function applications的语法是这样的:

SimpleExpr    ::=  SimpleExpr1 ArgumentExprs
ArgumentExprs ::=  ‘(’ [Exprs] ‘)’
                |  ‘(’ [Exprs ‘,’] PostfixExpr ‘:’ ‘_’ ‘*’ ‘)’
                |  [nl] BlockExpr
Exprs         ::=  Expr {‘,’ Expr}

因此,函数的参数可以是被( )包围的一个或多个表达式,或者如果函数采用单个参数,则可以是单个BlockExpr

在关于blocks的部分上我们发现:

BlockExpr  ::=  ‘{’ CaseClauses ‘}’
             |  ‘{’ Block ‘}’
Block      ::=  BlockStat {semi BlockStat} [ResultExpr]

部分函数是使用CaseClauses选项定义的,因此必须用{ }包围才能创建块表达式。然后,该块表达式是具有单个参数的函数的有效参数。

具有多个参数的函数必须始终使用( )