【问题标题】:Scala compiler says unreachable code, why?Scala 编译器显示无法访问的代码,为什么?
【发布时间】:2010-04-13 18:41:32
【问题描述】:

我是 Scala 新手...这是代码:

  def ack2(m: BigInt, n: BigInt): BigInt = {
      val z = BigInt(0)
      (m,n) match {
          case (z,_) => n+1
          case (_,z) => ack2(m-1,1) // Compiler says unreachable code on the paren of ack2(
          case _ => ack2(m-1, ack2(m, n-1)) // Compiler says unreachable code on the paren of ack2(
      }
  }

我试图理解...为什么会出现这个错误?

注意:我正在使用 Scala Eclipse 插件 2.8.0.r21376-b20100408034031 ch.epfl.lamp.sdt.feature.group

【问题讨论】:

    标签: scala unreachable-code


    【解决方案1】:

    模式匹配里面的 z 不是你在外面声明的 z,它引入了一个新的变量绑定。因此,第一种情况将匹配所有可能的对(将 z 绑定到该对的第一个元素并丢弃第二个元素),而其他情况将永远无法到达。

    如果将模式中的z 替换为

    `z`
    

    它将引用现有的 z 而不会引入新的绑定,因此它将按您的意愿工作。如果您不喜欢带有反引号的语法,也可以将 z 重命名为 Z。

    【讨论】:

    • 好吧,你回答了我的问题......我也应该问如何最好地解决它:)如果 m == 0 => n+1 ,我可以将其更改为 case _ ; case _ if n == 0 => ack2(m-1,1) 是唯一的方法吗?我不能在案例之后直接将 0 放在括号中,因为它抱怨它不是 BigInt。我不能将 BigInt(0) 放入括号中,因为它抱怨它不是案例类构造函数
    猜你喜欢
    • 1970-01-01
    • 2022-11-17
    • 2014-10-03
    • 2018-08-22
    • 1970-01-01
    • 2016-01-08
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多