【问题标题】:What is the "Value" in Scala Enum class?Scala Enum 类中的“值”是什么?
【发布时间】:2021-05-03 05:39:20
【问题描述】:

我是 scala 的新手,我正在阅读此页面中的 Enum 类(https://www.scala-lang.org/api/2.13.3/scala/Enumeration.html) 我有两个问题:

  1. 在 WeekDay 的定义中,val Mon、Tue、Wed、Thu、Fri、Sat、Sun 中的“Value”是什么=“Value”
  2. 对象WeekDay定义后,这里为什么需要“import WeekDay._”?

谢谢!

Screenshot of the code is here

【问题讨论】:

  • Scala 2 中的 Enum 类非常糟糕。没有人真正使用它,人们倾向于手动滚动密封特征,改用 enumeratum 甚至 Java 枚举之类的第三方库。所以不要在这上面花费太多精力。好消息:Scala 3 已经改进了更好的枚举。

标签: scala class


【解决方案1】:
  1. 来自 Scala 文档

对 Value 方法的每次调用都会为枚举添加一个新的唯一值。为了便于访问,这些值通常被定义为枚举的 val 成员。

所以Mon, Tue, Wed, Thu, Fri, Sat, Sun 只是简单的值,每个值都通过调用一个名为Value 的函数来实例化(参见https://github.com/scala/scala/blob/2.13.x/src/library/scala/Enumeration.scala#L162

  1. 导入不是为了定义工作日,而是为了使用。请注意,Mon、Tue 等是在对象内部定义的。就像 scala 中的每个标识符一样,您需要导入以访问在另一个包或对象中定义的标识符。如果您在一个文件中定义枚举并在另一个文件中使用它会更清楚

  2. 您没有问,但在许多情况下,您还应该考虑使用 sealed trait 或纯 java 枚举,以便获得详尽的匹配警告。当您不处理枚举中的所有情况时,scala 编译器会告诉您这是一件非常有用的事情。如果不能处理所有情况,许多人认为建模错误。见https://underscore.io/blog/posts/2014/09/03/enumerations.html

【讨论】:

  • 重要的是,Value 不是 Scala 关键字。这是Enumeration 上的一种普通方法,它完全可以满足我们的需要。如果标准库没有提供,我们可以自己写。
  • 此外,虽然很少使用,但您可以在 Scala 中执行类似 val a, b = new StringBuilder() 的操作,ab不同 StringBuilders。这就是 val X, Y, Z = Value 使用的功能
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-18
  • 2011-09-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多