如何模式匹配继承树中的抽象父类

2024-02-08

我是 scala 新手,有 java 背景。

有没有一种方法可以在类继承树中以叶子作为案例类和节点抽象类或特征来模式匹配超类(或特征)?据我所知,案例类继承是不允许的。

我认为在大型继承树中匹配抽象类的模式会非常有帮助

下面代码中最后一个case在编译过程中match语句出错

sealed trait Person {
   def name: String
}

case class Customer(name: String, email: String) extends Person

sealed trait Employee extends Person {
   def id: Int
}

case class Worker(name: String, id: Int, skills: Array[String]) extends Employee

case class Manager(name: String, id: Int, title: String) extends Employee

def process(p: Person) = p match {
   case Customer(_, email) => email
   case Employee(name, _) => name + "@acme.com"
}

你错过了name领域在Employee and an unapply的伴随对象中的方法Employee:

sealed trait Employee extends Person {
  def id: Int
  def name: String
}

object Employee {
  def unapply(e: Employee): Option[(String, Int)] =
    Option(e) map { e =>
      (e.name, e.id)
    }
}

通过上述更改,处理方法不会出现任何问题:

def process(p: Person) = p match {
  case Customer(_, email) => email
  case Employee(name, _) => name + "@acme.com"
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何模式匹配继承树中的抽象父类 的相关文章

随机推荐

  • 空数组似乎同时等于 true 和 false

    空数组为 true 但也等于 false var arr console log Array arr if arr console log It s true if arr false console log It s false if a
  • AWS dax 稳定性问题

    我正在尝试将 DAX 引入我们的架构 但到目前为止尚未成功 通过 lambda 发生与 dax 的连接 完成的设置类似于 AWS 文档中的示例 Lambda 和 Dax 位于同一个 vpc 中 它们大部分时间都可以看到对方 并且 dax 正
  • 为什么我无法在 PHP 文件中使用 AJAX 发布 JSON 数据?

    我有一个 AJAX 脚本 可以在我的 PHP 文件之一中发布数据 var lname ptLastName val var fname ptFirstName val var mname ptMiddleName val ajax type
  • 如何在 JavaScript 中执行 str_replace,替换 JavaScript 中的文本?

    我想用str replace或其类似的替代方案来替换 JavaScript 中的某些文本 var text this is some sample text that i want to replace var new text repla
  • map 不是reactJS 中的函数

    当我执行 console log response data 时 它返回了 2 个数据集 即 post 和 user const dbdata setDBData useState useEffect async gt const resp
  • CSS 网格在 Flexbox 内时不会增长

    我对 CSS Grid 的理解是 它会增长以填充其父级 但是当父级的大小由 Flexbox 控制时 这似乎无法正常工作 In 这个例子 https stackblitz com edit js gds31u file index html
  • 如果一个数字位于两个数字之间,则分配一个值

    我试图将 1 的值分配给向量中 2 到 5 之间的每个数字 我认为 if then 语句会起作用 我遇到了一些麻烦 我不认为 2 x lt c 3 2 6 7 8 1 3 2 5 if 2
  • 返回唯一值而不删除重复项 - C#

    我知道关于删除重复项后返回数组中的唯一值有很多答案 但是删除重复项后数组中的每个元素不是都是唯一的吗 我只想在删除任何重复项之前返回唯一的值 如果该元素在原始数组中重复 我不希望它出现在最终数组中 那么这个数组 0 1 1 2 3 3 3
  • Google OAuth:无法使用授权代码获取刷新令牌

    我正在使用 Google API 客户端进行 Google Analytics 和 OAuth 2 0 我阅读此内容是为了获取刷新令牌 但它没有出现 https developers google com identity protocol
  • Internet Explorer 7 8:jQuery UI 效果仅工作一次

    Context 我使用 jQuery UI 效果 slide and drop 打开和关闭幻灯片 以下代码适用于 Chrome Firefox 和 IE 9 在 IE 7 和 8 上 我只能打开和关闭幻灯片一次 幻灯片保持隐藏状态后 有什么
  • 类库中的控制器和视图

    我有一组在许多项目中使用的控制器和视图 我想知道是否可以将其放入类库中并将其作为普通的 lib 文件重用 我怎样才能做到这一点 绝对可行 你需要的东西 在应用程序启动时注册路线的某种方法 一个了解库视图和应用程序特定视图的视图引擎 第一个很
  • 如何在ReactJs中制作步骤向导表单?

    我正在制作简历生成应用程序 并且我已经将这些事情完成了组件 目前有两个组件 例如 gt BasicDetails gt EmploymentDetails 完整的工作示例 https codesandbox io s next dynami
  • 查找鼠标相对于控件而不是屏幕的位置

    我有一个名为的图片框BGImage 我希望当用户单击此按钮时我可以捕获鼠标相对于BGImage 我尝试过使用MousePosition 却发现它给出了鼠标在屏幕上的位置 而不是在 PictureBox 上 所以我也尝试使用PointToCl
  • 使用 python 拉取更改日志时出现问题

    我正在尝试使用 python 查询和提取更改日志详细信息 以下代码返回项目中的问题列表 issued jira search issues project proj a maxResults 5 for issue in issued pr
  • 如何删除 Room 数据库?

    如何删除我的应用程序的 Room 数据库 我找到了clearAllTables https developer android com reference androidx room RoomDatabase html clearAllTa
  • 有虚拟 Twain 扫描仪吗?类似于 Daemon Tools 虚拟 CD [关闭]

    Closed 这个问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 我正在测试一个扫描应用程序 目前我没有任何扫描仪可以插入它 是否有像 Daemon Tools 那样的
  • 如何将 Nearforums 集成到我当前的 MVC 应用程序中

    我创建了一个 ASP NET MVC 4 0 应用程序 现在我正在尝试寻找一个可以将其自身集成到我的 MVC 应用程序中的第 3 方论坛 我做了一些搜索 发现附近的论坛看起来不错 我已经下载了 Web 和 Db 脚本 我已经阅读了文档并设法
  • 检测浏览器是否为三星手机

    有没有人想出一个好方法来检测客户端的浏览器是否是三星手机 我专门寻找三星 S3 和 Note 2 但如果它能匹配 S2 和 Note 1 或其他三星手机 我就可以接受 面向未来的东西 即可能与 S4 Note3 一起使用显然是理想的 似乎没
  • jQuery 验证错误类未从字段中删除

    我有一个 jQuery 验证的自定义方法 基于斯帕克的回答 https stackoverflow com questions 15238958 ensure at least one from a group of three check
  • 如何模式匹配继承树中的抽象父类

    我是 scala 新手 有 java 背景 有没有一种方法可以在类继承树中以叶子作为案例类和节点抽象类或特征来模式匹配超类 或特征 据我所知 案例类继承是不允许的 我认为在大型继承树中匹配抽象类的模式会非常有帮助 下面代码中最后一个case