【问题标题】:Cannot be used as an extractor in a pattern because it lacks an unapply or unapplySeq method不能用作模式中的提取器,因为它缺少 unapply 或 unapplySeq 方法
【发布时间】:2021-10-11 12:01:45
【问题描述】:

我有一个非常简单的 Scala 代码,我想在其中应用模式匹配:

trait Expr
case class Number(n: Int) extends Expr
case class Sum(a: Expr, b: Expr) extends Expr
case class Prod(a: Expr, b: Expr) extends Expr

def eval(e: Expr): Int = e match
  case Number(n) => n
  case Sum(a, b) => eval(a) + eval(b)
  case Prod(a, b) => eval(a) * eval(b)

但是当我运行代码时,错误上升:“数字不能用作模式中的提取器,因为它缺少 unapply 或 unapplySeq 方法”

我应该怎么做才能避免这个错误? 谢谢

【问题讨论】:

  • 我无法重现它:scastie.scala-lang.org/BalmungSan/N2TIb2xXQZC48wDgAYSqkA/1 所以它要么是一个 IDE 错误 (这似乎是 Scala 3,也许你正在使用 IntelliJ 并且它还不能很好地支持它) 或者您有更多代码可以显示能够重现错误 - 顺便说一句,如果您使用的是 Scala 3,您可能想改用enum
  • @LuisMiguelMejíaSuárez 我想你是对的,我使用的是 IntelliJ,并且在 VS Code 中效果很好。

标签: scala pattern-matching


【解决方案1】:

您可能在eval 定义的范围内导入了java.lang.Number

确保改为导入您的 Number 定义(通过删除 Java 导入或重命名它,只要最适合您的用例...),它将正常工作。

【讨论】:

    【解决方案2】:

    显然,之前所说的是真的,java.lang.Number 在 IntelliJ 中运行时会影响 case class Number。如果你不想放弃你的IDE,你也可以将case class Number重命名为case class Num。这样,代码至少在我的机器上运行良好。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-01-30
      • 1970-01-01
      • 2018-06-09
      • 2020-09-29
      • 2021-02-27
      相关资源
      最近更新 更多