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

标签 scala pattern-matching apply case-class syntactic-sugar

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

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

最佳答案

案例类并不神奇,它们在幕后所做的是生成大量样板代码。
在这两者之间,是 apply (factory constructor)unapply (extractor) 方法类。
当您尝试模式匹配一个对象时,编译器尝试做的是调用伴随对象的提取器方法 - 因此,您只需要实现自己的提取器对象。

例如

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)
}

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

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

有关引用,请参阅 this .

关于scala - 如何在scala中使用没有案例类的模式匹配?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53580889/

相关文章:

algorithm - 如何将一棵树与大量模式进行匹配?

python - 向量化python函数

r - 如何使用 R 将包含 if-else 结构的函数用于每一列

r - 使用 RJSONIO 解析一行 JSON 对象的文本文件

scala - sbt 在 fork 模式下将信息消息显示为错误

mysql - 光滑的表未保存在数据库中,没有错误

scala - Scala中的函数式编程示例

list - 如何在序言中对列表中的元素进行模式匹配?

scala - 以编程方式提交作业时 Spark EC2 集群上出现 java.io.EOFException

string - 执行 Boyer-Moore 模式匹配时是否必须考虑编码?