如何在scala中使用case类获取枚举值

如何在scala中使用case类获取枚举值,scala,Scala,我试图在scala中使用case类实现enum 关于问题 我想打印一条带有如下id的消息,然后键入新行 type value 100 abc 200 0 说明:100 abc代表消息ID 200 0表示MessageRepType和O表示TYPE1假设您的消息是ABCMessageMessageIdTag100,值100ABC,MessageRepTypeTag200,类型1还假设Tag200类似于Ta

我试图在scala中使用case类实现enum

关于问题

我想打印一条带有如下id的消息,然后键入新行

   type        value
   100        abc              
   200        0  
说明:100 abc代表消息ID
200 0表示MessageRepType和O表示TYPE1

假设您的消息是ABCMessageMessageIdTag100,值100ABC,MessageRepTypeTag200,类型1还假设Tag200类似于Tag100,并且案例类MessageRepTypetag:Tag[Int],值:MessageType是案例类MessageRepTypetag:Tag,值:MessageType和MessageType扩展消息[Int]:


一个不同的方法仍然不确定你想要实现什么。模式匹配的另一个答案是我更喜欢的

您可以使用简化的访问者模式删除不相关的部分:

trait Show {
  def show: String
}

sealed trait Tag extends Show {
  override def show: String = this.getClass.getSimpleName.init
}

//object Tag {
  case object Tag100 extends Tag
  case object Tag200 extends Tag
//}
这样,您可以像这样显示标记:

Tag100.show // Tag100
case类还可以实现show:

您也可以在其他方法中使用此选项来实现所需的打印:

def convertMessageId(message: MessageId): String = {
  val typ = message.tag.show
  val value = message.value.show
  s"$typ\t$value"
}
val id = convertMessageId(message.id)
def convertType(message: MessgeRepType): String = {
  val typ = message.tag.show
  val value = message.value.show
  s"$typ\t$value"
}

val message: ABCMessage = ABCMessage(MessageId(Tag100, Value100("abc"),MessageRepType(Tag200, TYPE1))
val messageAsString = Seq("type\tvalue", id, typ).mkString(sep)
println(messageAsString)
如果类型安全和简单,通用用法也很重要,请查看“产品和服务”

如果类型安全性不是那么重要,那么对于您的用例来说,了解用例类的实现就足够了,这样您就可以逐个访问它们并使用其内容

另一种解决方案可能是将您的数据结构转换为JSON,例如,有许多Scala lib用于此,并将其用于进一步处理。仍然是泛型的,但不是类型安全的


可能也与此相关。

看看@cchantep,我已经更新了问题,想获得case object的值printlnmessage.id+\t+message.type.typecode有什么问题请不要发布无法编译的代码,除非您问,为什么这段代码无法编译?在任何情况下,您都应该发布演示问题所需的绝对最少的代码。@jwvh对此表示歉意。我已经更新了代码更新的答案。我们可以在聊天室讨论吗。我已经ping了你,我指的是打印case类成员的通用解决方案。我的case类作为enum可能有10-15个值。如果数字增长,则不建议使用case匹配,因为您没有太多选项,我想您已经看到我的注释,无法应用它:>//我会将typeCode放在MessageType上,但它不在那里,所以模式匹配我认为这个更好地解释了我的问题
Tag100.show // Tag100
sealed trait Value[+A] extends Show {
  def v: String
  override def show: String = v
}
case class Value100(v: String) extends Value[String]
def convertMessageId(message: MessageId): String = {
  val typ = message.tag.show
  val value = message.value.show
  s"$typ\t$value"
}
val id = convertMessageId(message.id)
def convertType(message: MessgeRepType): String = {
  val typ = message.tag.show
  val value = message.value.show
  s"$typ\t$value"
}

val message: ABCMessage = ABCMessage(MessageId(Tag100, Value100("abc"),MessageRepType(Tag200, TYPE1))
val messageAsString = Seq("type\tvalue", id, typ).mkString(sep)
println(messageAsString)