Scala 比较字符串和枚举

Scala 比较字符串和枚举,scala,Scala,我在scala中有一个枚举映射到JPA中的字符串。为了更舒适的编码,我定义了它们之间的隐式转换。因此,我现在可以定义valueval person.role=“User”,-person.role是枚举类型“User”一个字符串,因此需要进行转换。但是,当我尝试比较这两个变量时,我总是得到false,因为def等于(arg0:Any):Boolean接受Any,因此不会触发任何转换。我需要一些明确的转换,但我的计划是能够忽略这一点,您认为什么是最佳实践|最简洁的解决方案?您的枚举中的值(“用户”

我在scala中有一个枚举映射到JPA中的字符串。为了更舒适的编码,我定义了它们之间的隐式转换。因此,我现在可以定义value
val person.role=“User”
,-
person.role
是枚举类型
“User”
一个字符串,因此需要进行转换。但是,当我尝试比较这两个变量时,我总是得到false,因为
def等于(arg0:Any):Boolean
接受
Any
,因此不会触发任何转换。我需要一些明确的转换,但我的计划是能够忽略这一点,您认为什么是最佳实践|最简洁的解决方案?

您的
枚举中的
值(“用户”)
Val
类型。我相信它的
equals的实现不会比较值的字符串名。我认为有一种方法是创建自己的
Enumeration
Val
,这样如果名称匹配,它就会返回true

但在我的代码使用中,而不是在JPA中,我总是将字符串转换为
MyEnumeration.Value
。这很容易做到:

 object E extends Enumeration { val User = Value("User") }

 scala> val a = E.withName("User")
 a: E.Value = User
请注意,在使用带名称的
时,如果字符串与枚举中的任何名称不匹配,则会出现异常

然后在比较中始终使用枚举字段:

scala> a == E.User
res9: Boolean = true

如果JPA只返回一个字符串,并且没有办法绕过它。然后,我认为最好的选择是将值转换为字符串并将字符串与字符串进行匹配,或者将字符串升级为Val并比较Val。混合这些类型对于比较不起作用,除非您对
equals
方法实现某种扩展,这很棘手。

扩展Thomas的答案,如果您使用的是比较分支,那么使用模式匹配可能更合适:

object Role extends Enumeration {
   val User = MyValue("User")
   val Admin = MyValue("Admin")

   def MyValue(name: String): Value with Matching = 
         new Val(nextId, name) with Matching

   // enables matching against all Role.Values
   def unapply(s: String): Option[Value] = 
      values.find(s == _.toString)

   trait Matching {
      // enables matching against a particular Role.Value
      def unapply(s: String): Boolean = 
            (s == toString)
   }
}
然后,您可以按如下方式使用它:

def allowAccess(role: String): Boolean = role match {
   case Role.Admin() => true
   case Role.User() => false
   case _ => throw ...
}


您是否基于“枚举”和“值”进行映射?@Thomas是的,我使用的是scala的
scala.Enumeration
scala.Enumeration.Value
比较的上下文/用例是什么?模式匹配可能提供更好的解决方案,但它实际上取决于您要完成的任务。
// str is a String
str match { 
   case Role(role) => // role is a Role.Value
   case Realm(realm) => // realm is a Realm.Value
   ...
}