我正在尝试学习scala,我正在努力理解为什么以下是合法的:
for (idx <- 1 to 10) yield idx
但以下内容不合法。
for (idx <- 1 to 10) { yield idx }
他们在语法上看起来是一样的。我错过了什么?
提前致谢。
答案 0 :(得分:9)
因为这是解析器的工作方式,所以这里是Scala specification的部分:
Expr1 ::= ‘for’ (‘(’ Enumerators ‘)’ | ‘{’ Enumerators ‘}’)
{nl} [‘yield’] Expr
它说我们可以拥有一个或多个如此命名的枚举器,{nl}
说我们可以嵌套多个for
,如
for(...)
for(...)
...
我们可以添加可选的yield
关键字,后跟表达式,但没有大括号的位置。它本身的表达式(正文)可以是(idx)
,{idx}
,只是idx
或其他内容,所以这是合法的:
for (idx <- 1 to 10) yield { idx }
答案 1 :(得分:1)
这归结为for-expression如何去糖(以及与之相关的解析器规则)。
在第一种情况下,编译器会将理解解除以下内容:
(1 to 10).map(idx => idx)
第二种情况是允许人们使用for循环的简写(这可能很麻烦)。 for
的第二种形式实际上是foreach
,其结果始终是Unit
,因此yield
是不可能的,因为已经定义了返回类型。
答案 2 :(得分:1)
yield
似乎可以将其替换为map
。
因此,这可能
for (idx <- 1 to 10) yield {val square = idx * idx; square}
您可以在scala-yield-syntax找到更多详情,并在此处详细了解can-someone-explain-scalas-yield