【问题标题】:scala keyword precedencescala关键字优先级
【发布时间】:2011-02-19 13:24:42
【问题描述】:

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}

但我仍然想知道第二个示例代码是如何解释的。我希望第二个示例也能正常工作,而无需用括号括起来。

谁能给我解释一下或指出规范中正确的章节?

【问题讨论】:

    标签: scala pattern-matching yield


    【解决方案1】:

    第二个例子解释为:

    for(i <- 1 to 10) yield { i match {case x => x.head} } // won't compile
    

    for 的大致语法如下:

    for (Enumerators) yield Expr
    

    由于i match { case x =&gt; 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 页。

    【讨论】:

    • 但是i 不也是一个表达式吗?为什么“i-match”关联的优先级高于“yield-i”?这不是与其他 Scala 语法不一致(即从左到右的关联性)吗?
    • 解析器不寻找“完成”语句的东西,他们只是更喜欢添加它而不是关闭它。所以他们总是把尽可能长的东西当作“expr”。
    猜你喜欢
    • 2011-11-27
    • 1970-01-01
    • 2020-07-06
    • 1970-01-01
    • 1970-01-01
    • 2014-09-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多