Scala 中的 Case 对象与枚举

2024-06-25

是否有关于何时使用的最佳实践指南案例类 http://en.wikipedia.org/wiki/Scala_%28programming_language%29#Case_classes_and_pattern_matching(或 case 对象)与在 Scala 中扩展枚举?

它们似乎提供了一些相同的好处。


一个很大的区别是Enumeration支持从某些实例化它们name细绳。例如:

object Currency extends Enumeration {
   val GBP = Value("GBP")
   val EUR = Value("EUR") //etc.
} 

然后你可以这样做:

val ccy = Currency.withName("EUR")

当希望保留枚举(例如,保存到数据库)或从文件中的数据创建枚举时,这非常有用。然而,我发现总的来说,Scala 中的枚举有点笨拙,并且有一种尴尬的附加组件的感觉,所以我现在倾向于使用case objects. A case object比枚举更灵活:

sealed trait Currency { def name: String }
case object EUR extends Currency { val name = "EUR" } //etc.

case class UnknownCurrency(name: String) extends Currency

所以现在我的优势是...

trade.ccy match {
  case EUR                   =>
  case UnknownCurrency(code) =>
}

As @chaotic3quilibrium https://stackoverflow.com/users/501113/chaotic3quilibrium指出(为了便于阅读进行了一些更正):

关于“UnknownCurrency(code)”模式,除了“破坏”货币代码的闭集性质之外,还有其他方法可以处理找不到货币代码字符串的情况。Currency type. UnknownCurrency存在类型Currency现在可以潜入 API 的其他部分。

建议把这个案子推到外面去Enumeration并让客户处理一个Option[Currency]类型将清楚地表明确实存在匹配问题,并“鼓励”API 用户自行解决。

为了跟进这里的其他答案,主要缺点case objects over Enumerations are:

  1. 无法迭代“枚举”的所有实例。情况确实如此,但我发现在实践中很少需要这样做。

  2. 无法从持久值轻松实例化。这也是事实,但是,除了大量枚举(例如所有货币)的情况之外,这不会带来巨大的开销。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Scala 中的 Case 对象与枚举 的相关文章

  • 当我在 scala 中使用全局映射变量而不广播时会发生什么

    在 scala 中 当我在 scala 中使用全局映射变量而不进行广播时会发生什么 例如 如果我使用变量collect 例如collectAsMap 看来它是一个全局变量 我可以在所有地方使用它RDD mapValues 函数无需显式广播它
  • scala的可变和不可变设置何时使用val和var

    我正在阅读 Scala Creator 编写的 Scala 编程 一书 我对 Set 的示例有点困惑 这是不可变集 var jetSet Set Boeing Airbus jetSet Lear println jetSet contai
  • Scala 将字符串转换为映射

    转换这个最快的方法是什么 a ab b cd c cd d de e ef f fg 进入 scala 中的可变映射 我从 500MB 文件中读取了这个输入字符串 这就是我关心速度的原因 如果您的 JSON 像您的示例一样简单 即一系列键
  • 使用 Akka 将文件从服务器流式传输到客户端

    基本上我想允许用户从服务器下载 csv 文件 假设服务器上已存在 CSV 文件 API 端点通过 GET export 公开 如何将文件从 Akka HTTP 服务器流式传输到客户端 这就是我到目前为止所拥有的 Service def ex
  • Scala“对象”的继承

    我有这个Java代码 class Super public static void foo bar public static void bar out println BAR public static void main String
  • 为什么 Vector[Option[Int]] 上的 flatMap 其映射器函数结果不是 Vector[Option[Int]] 有效?

    例如 Vector Some 1 Some 2 Some 3 None flatMap n gt n 产生一个Vector 1 2 3 而不是给出错误 正如我在其他语言中看到的那样 flatMap当你有一个产生嵌套的映射器函数时使用 所以我
  • 重载方法值与替代方法的聚合

    我有以下函数 但无法编译 private def save pea KStream String String Unit pea groupByKey aggregate gt folder String String value Stri
  • 通过Listener获取Spark thrift服务器查询中读取的行数

    我正在尝试为我们的 ST 服务器构建一个监控系统 到目前为止 诸如记录查询 检索的行 红色和花费的时间之类的事情都很好 我已经实现了一个自定义侦听器 我能够毫无问题地检索查询和时间 侦听SparkListenerSQLExecutionSt
  • Scala Spark:将数据框中的双列转换为日期时间列

    我正在尝试编写代码来将日期时间列 date 和 last updated date 转换为 mm dd yyyy 格式以进行显示 它们实际上是 unix 时间转换为双精度数 我该怎么做呢 import org joda time impor
  • 在 Scala REPL 中访问包私有方法

    假设我有一个private stuff method Stuff something in org my stuff 我可以在 Scala REPL 中做些什么 以便我可以调用Stuff something没有得到错误error value
  • 首次使用 SBT - 检索代理背后的依赖项时出现问题

    我已经下载了 SBT sbt 0 13 15 zip 并将其解压缩 但在运行 sbt bat 时遇到问题 最初 我遇到了代理问题 当我发现需要指定时修复了这些问题onlyhttpsconfig 而不是 http 的 当提供两者时 它使用的是
  • 仅当要转换的函数至少有两个参数时,函数到二阶函数的隐式转换才有效

    我有隐式转换和高阶函数的问题 似乎只有当要转换的函数至少有两个参数时 函数到二阶函数的隐式转换才有效 Works implicit def conv foo Integer gt String String gt String null 不
  • 如何列出Resources文件夹中的所有文件(java/scala)

    我正在编写一个函数 需要访问资源中的文件夹 并循环遍历所有文件名 如果这些文件符合条件 则加载这些文件 new File getClass getResource images sprites getPath listFiles 返回空指针
  • 使用 Scala 在 Apache Spark 中拆分字符串

    我有一个数据集 其中包含以下格式的行 制表符分隔 Title lt t gt Text 现在对于每个单词Text 我想创建一个 Word Title 一对 例如 ABC Hello World gives me Hello ABC Worl
  • scala案例类复制实现

    我找不到 scala 中案例类的复制是如何实现的 我可以以某种方式检查一下吗 我虽然 Intellij 可以指出我的实现 但它不想跳转 我不知道为什么 您可以使用以下命令检查 scala 案例类输出scalac print ClassNam
  • 在 Scala 中实现“.clone”

    我正在想办法 clone我自己的对象 在 Scala 中 这是为了模拟 因此可变状态是必须的 由此产生了克隆的全部需要 在提前模拟时间之前 我将克隆整个状态结构 这是我目前的尝试 abstract trait Cloneable A See
  • Scala 中表达式和语句有什么区别

    我是 Scala 世界的新手 想知道表达式和语句之间有什么区别 以及为什么 if else 用于表达式 而不是语句 是否有办法在 if else 中使用语句 EDIT 正如 J rg W Mittag 在评论中指出的 这个答案实际上是错误的
  • 结构化流式自定义重复数据删除

    我有一个从 kafka 进入 dataFrame 的流数据 我想根据 Id 删除重复项并根据时间戳保留最新记录 样本数据是这样的 Id Name count timestamp 1 Vikas 20 2018 09 19T10 10 10
  • sbt:未经授权发布到公司 Nexus 存储库

    快速解决 所需的凭证需要连接所定义的确切领域 请参阅下面如何找到您定义的那个 但最肯定的是 Sonatype Nexus Repository Manager 像平常一样将其余详细信息添加到凭据中 c data user sbt crede
  • Scala 不可变 Map 速度慢

    当我创建地图时 我有一段代码 val map gtfLineArr 8 split map split collect case Array k v gt k v toMap 然后我使用这张地图来创建我的对象 case class MyOb

随机推荐

  • 将最新的 terser-webpack-plugin 与 Webpack5 一起使用

    根据这个链接 简洁的文档 https webpack js org plugins terser webpack plugin terseroptions如果您使用最新的 Webpack 5 则无需安装 Terser 插件 因为它已包含在
  • 如何清除源代码文件中的不可见字符?

    我有一个奇怪的问题 在我的 HTML PHP 代码中的某个地方有一个隐藏的 不可见的字符 我似乎无法摆脱它 通过从 Firebug 复制并转换它 我将其标识为 xFEFF 或 零宽度不间断空间 它在我的网站中显示为非空文本节点 并导致严重的
  • 尝试附加行谷歌表格API

    我一直在尝试让追加行示例工作几个小时 但没有成功 我没有收到任何错误 但我的电子表格根本没有更新 https developers google com sheets samples writing append values https
  • 如何多次上传一个apk到play商店?

    我认为我已经构建了APK 唯一的变化是一些资源 仅此而已 这不是新版本 这是新的 apk 或新应用程序 我怎样才能将这些APK上传到Play商店 我的项目分为多层 我相信每一层都是一个包 不是吗 那么 我是否必须重命名每个包 我必须做哪些更
  • 尽管有 TryCatch 活动,异常仍会从工作流中逃脱

    我在 Windows 服务中有一个工作流程 它是一个定期执行工作的循环 这项工作是在一个TryCatch http msdn microsoft com en us library system activities statements
  • 无||假与假||红宝石中的零

    nil false回报false and false nil回报nil 有人对此有解释吗 在 Ruby 中 一切都是表达式 表达式将返回其中计算的最后一个值 对于您的两个示例 左侧 表达式的计算结果为假值 因此 Ruby 然后计算右侧并返回
  • Windows 更新 KB4040972/73 导致 WPF 类出现黑色图像

    我有一个依赖于深度缩放图像 从 PNG 转换为各种比例的 JPG 金字塔 的应用程序 我们使用 DeepZoomTools dll 来实现 这依赖于PresentationCore dll 多年来一直运行良好 推出 KB4040972 和
  • RAM 到 RAM 的 DMA 传输

    我的一个朋友告诉我 在 x86 架构上 DMA 控制器无法在两个不同的 RAM 位置之间传输 它只能在RAM和外设 如PCI总线 之间传输 这是真的 因为 AFAIK DMA 控制器should能够在位于总线上并具有地址的任意设备之间 特别
  • 使用 Javascript/JQuery 进行 XML/XSL 转换

    谁能告诉我是否有一种方法可以在客户端使用 Javascript 或 JQuery 进行 XML XSLT 转换 这种方法适用于所有主要浏览器 Chrome Safari Firefox 和 IE 谢谢 我应该从一开始就声明我编写了这个脚本
  • 生成连接 2 点的线的像素值

    我在尝试连接图片中的各个点时遇到一些麻烦 见下文 现在 我的代码如下 first time resulting coords 0 40 for i in range len first time if i lt len first time
  • 在 blogdown 中包含图像预览(.Rmd yaml 标头)

    我尝试了几种方法 但到目前为止都没有效果 我想在我的主博客页面上添加用 R markdown Rmd 编写的博客文章的图像预览 其中通常会显示许多帖子和项目 我可以使用以下从 Hugo 获取的代码使其在普通 markdown md 中工作a
  • JTable 中的结果集

    如何在 JTable 中显示结果集 我正在使用这个代码 String record new String ColCount for i 0 i
  • Gradle 找不到用于使用 NDK 进行调试的 OpenCV 库

    我一直在使用 C 代码开发 Android 应用程序 只需执行ndk build 我一直使用 OpenCV 所以在我的Android mk有 include CLEAR VARS OPENCV LIB TYPE SHARED OPENCV
  • 在文本文件中的特定位置添加新行。

    我正在尝试在文件中添加特定的文本行 特别是在两个边界之间 如果我想在 item1 的边界之间添加一条线 它会是什么样子 item1 2550 coins 995 200000 7 2550 coins 995 200000 7 2550 c
  • 在sql server中,sys.types中的user_type_id和system_type_id有什么区别

    sql server中sys types视图中的user type id和system type id有什么区别 我想将sys columns与sys types进行内连接以获取用户表中列的数据类型 但这两个视图都有两个字段user typ
  • 通过从 python 文件引用 requests.txt 中的软件包来安装它

    我有以下内容requirements txt file beautifulsoup4 4 8 2 py37 0 urllib3 1 25 8 py37 0 pyopenssl 19 1 0 py37 0 openssl 1 1 1d h1d
  • 查找从 unix 命令行输入的单词出现的次数

    对于文件file1 txt其中包含 Apple fruit Apple tree Tree AApple AApklle Apple apple TREE Apple 我想查找该单词出现的次数Apple 输出应该是4 我的 script s
  • 如何在vba中查找命名形状的索引号

    我运行了以下代码 for i 1 to activedocument Shapes count debug Print activedocument shapes i name next 并获得了形状列表 但是缺少一个形状 我选择了一个未包
  • Fabricjs HTML5 Canvas:为什么图像大小调整得如此糟糕?

    当我将 775 x 775 图像添加到 Fabricjs 画布并将其大小调整到大约 90 x 90 时 图像的质量大大降低 但如果我添加相同的图像作为 img 并按比例缩小 它保留了其质量 为什么画布图像的质量变得这么低 我怎样才能使画布图
  • Scala 中的 Case 对象与枚举

    是否有关于何时使用的最佳实践指南案例类 http en wikipedia org wiki Scala 28programming language 29 Case classes and pattern matching 或 case