如何解决在Scala中定义枚举的区别
在scala中,如下定义枚举有什么区别
object TargetRelation extends Enumeration {
val Organizations = "organizations"
val Individuals = "individuals"
val Things = "things"
}
object TargetRelation extends Enumeration {
type TargetRelation = Value
val Organizations = Value("organizations")
val Individuals = Value("individuals")
val Things = Value("things")
}
我的问题
- 哪种是定义枚举的首选方式
- 第一和第二之间有什么区别
- 如果我想对返回上述任一值的字符串进行大小写匹配。我应该使用哪一个
- 具有类型TargetRelation =值和不具有枚举类型的区别是什么
这是代码段
注意:target.resourceType是一个字符串
target.resourceType match {
case TargetRelationType.Individuals => {}
case TargetRelationType.Organizationse => {}
}
解决方法
这个:
object TargetRelation extends Enumeration {
type TargetRelation = Value
val Organizations = Value("organizations")
val Individuals = Value("individuals")
val Things = Value("things")
}
将使用内置对象和Enumeration
特征类型:
- 为每个
Value
生成名称 - 为每个
Value
分配顺序 - 提供用于将
String
解析为Value
的方法
其中TargetRelation.Value
是实际的枚举类型(这就是为什么人们有时将其别名为伴随对象名称并直接导入别名的原因。)
这个:
object TargetRelation extends Enumeration {
val Organizations = "organizations"
val Individuals = "individuals"
val Things = "things"
}
在任何地方都不会使用Value
,因此它实际上与此相同:
object TargetRelation {
val Organizations = "organizations"
val Individuals = "individuals"
val Things = "things"
}
含义-这只是常量String
的命名空间。
但是,从类型安全的角度来看,两者都几乎没有用,因为都无法对其进行详尽的检查。
targetRelation match {
case TargetRelation.Organizations => ...
// no warning or error about which cases are missing
}
如果您需要像Enum
这样的功能:名称解析,自动名称生成和订单生成,详尽性检查-两种方法都被采用{{1}的社区弃用 }个,其中sealed trait
个(和torch.nn.Linear
):
case object
// this ensured that matching is exhaustive
sealed trait TargetRelation
object TargetRelation {
case object Organizations extends TargetRelation
case object Individuals extends TargetRelation
case object Things extends TargetRelation
}
因此,您可以在解析阶段使用// like above but with tons of utilities
import enumeratum._
sealed trait TargetRelation extends EnumEntry
object TargetRelation extends Enum[TargetRelation] {
case object Organizations extends TargetRelation
case object Individuals extends TargetRelation
case object Things extends TargetRelation
val values = findValues
}
(支持Circe和许多其他库),然后将解析后的值与类型安全,速度更快的密封层次结构的案例对象进行比较。
第一个不是枚举。您可以省略扩展枚举并获得相同的结果。 它只是一个单例,带有几个字符串常量
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。