scala 中如何定义“关键字优先级”?
考虑这段代码:
for(i <- 1 to 10) yield i
这没关系,我得到一个从 1 到 10 的 Seq
,但是当我尝试立即匹配时:
for(i <- 1 to 10) yield i match {case x => x.head}
出现编译错误:错误:值头不是 Int 的成员
。
我可以将 for ... yield
括在括号中以赋予其优先级:
{for(i <- 1 to 10) yield i} match {case x => x.head}
但我仍然想知道第二个示例代码是如何解释的。我希望第二个示例也能正常工作,而无需用括号括起来。
有人可以向我解释一下或者指出规范中正确的章节吗?
最佳答案
第二个例子解释为:
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 }
解析为有效表达式( token 方面),因此编译器将如何看待它。因此,如果 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 页。
关于scala 关键字优先级,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5051008/