如何在scala中使用没有案例类的模式匹配?

Moz*_*ath 3 scala syntactic-sugar pattern-matching apply case-class

我听说我们可以在 Scala 中应用模式匹配而不使用案例类。另外,我的意思不仅仅是识别实际的实现类,还包括从对象中提取各种值。真的可能吗?我们怎样才能做到这一点?

在之前发布的类似主题的任何问题中,我找不到指向我的解决方案的可接受答案。因此,我决定提出一个新问题。

Lui*_*rez 6

案例类并不神奇,它们在幕后所做的就是生成大量样板代码。
其间是类的伴生对象上的apply (工厂构造函数)unapply (提取器)方法。
当您尝试模式匹配一​​个对象时,编译器尝试做的是调用伴生对象的提取器方法- 因此,您只需要实现自己的提取器对象。

例如

class User(val id: Int, val name: String)

object User {
  def apply(id: Int, name: String): User = new User(id, name)

  def unapply(user: User): Option[(Int, String)] =
    Some(user.id, user.name)
}
Run Code Online (Sandbox Code Playgroud)

现在您可以通过这种方式创建匹配用户。

val user = User(3, "Luis")
def getId(user: User): Int = user match {
  case User(id, name) => id
}
getId(user) // 3
Run Code Online (Sandbox Code Playgroud)

作为参考,请参阅