首页 > 解决方案 > 为什么在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 }),但是没有括号。那么这里发生了什么?这里有什么句法?

标签: scala

解决方案


答案在语言规范中。函数应用程序的语法是这样的:

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

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

继续关于的部分,我们发现:

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

部分函数是使用该CaseClauses选项定义的,因此必须将它们括起来{ }才能形成块表达式。然后,此块表达式是具有单个参数的函数的有效参数。

接受多个参数的函数必须始终使用( ).


推荐阅读