我发现当部分函数在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 })
,但没有括号。那么这里发生了什么?这是什么语法?
答案 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
选项定义的,因此必须用{
}
包围才能创建块表达式。然后,该块表达式是具有单个参数的函数的有效参数。
具有多个参数的函数必须始终使用(
)
。