如何在scala中定义“关键字优先级”?
考虑这段代码:
for(i <- 1 to 10) yield i
这没关系,我从1到10得到Seq
,但是当我尝试在之后匹配时:
for(i <- 1 to 10) yield i match {case x => x.head}
存在编译错误:error: value head is not a member of Int
。
我可以在括号中包围for ... yield
以使其优先:
{for(i <- 1 to 10) yield i} match {case x => x.head}
但我仍然想知道第二个示例代码是如何解释的。我希望第二个例子能够正常工作,而不用parens包围它。
任何人都可以向我解释或指出我在规范中的正确章节吗?
答案 0 :(得分:4)
第二个例子被解释为:
for(i <- 1 to 10) yield { i match {case x => x.head} } // won't compile
for 的近似语法如下:
for (Enumerators) yield Expr
由于i match { case x => x.head }
解析为有效表达式(标记为明智),因此编译器将看到它。因此,如果 Expr 看起来像一个表达式,那就是它的处理方式。根据这一推理,以下陈述是有效的:
for(i <- 1 to 10) yield for(j <- 1 to 2) yield (i, j)
for(i <- 1 to 10) yield if (i % 2 == 0) 'a' else 'b'
for(i <- 1 to 10) yield try { 1 / (i - 5) } catch { case _ => }
并且它们都等同于
for(i <- 1 to 10) yield { for(j <- 1 to 2) yield (i, j) }
for(i <- 1 to 10) yield { if (i % 2 == 0) 'a' else 'b' }
for(i <- 1 to 10) yield { try { 1 / (i - 5) } catch { case _ => } }
注意:Scala语言规范可用here(第一个链接)。相关部分位于A章(Scala语法摘要)中的第161页。