Parsing 将字符串内置解析为Scala case对象?

Parsing 将字符串内置解析为Scala case对象?,parsing,scala,Parsing,Scala,在Scala中,有没有办法从字符串自动解析case对象?使用一些内置/自动生成的Scala函数 例如,我有这些case对象:(请注意,有一个密封的父类) 我想知道是否有一些自动生成的函数可以像: FlagReason.fromString(值:String):FlagReason 其中FlagReason(“Spam”)将返回Spamcase对象 如果有,那么我不需要写我自己的——我已经写了: object FlagReason { def fromString(value: String)

在Scala中,有没有办法从字符串自动解析case对象?使用一些内置/自动生成的Scala函数

例如,我有这些case对象:(请注意,有一个密封的父类)

我想知道是否有一些自动生成的函数可以像:

FlagReason.fromString(值:String):FlagReason

其中
FlagReason(“Spam”)
将返回
Spam
case对象

如果有,那么我不需要写我自己的——我已经写了:

object FlagReason {
  def fromString(value: String): FlagReason = value match {
    case "Spam" => Spam
    case "Illegal" => Illegal
    case "CopyrightViolation" => CopyrightViolation
    case "Other" => Other
  }
}
背景:我正在将我的case对象转换为字符串,在html表单中用作单选按钮值。在处理提交的表单时,我将所选值转换回case对象

相关信息:这在Java枚举中实际上是可能的,例如,请参见此StackOverflow问题:


((我不认为我在寻找Scala的解析器组合器。我想如果我要使用它们,我仍然需要自己定义解析规则,而不是内置“自动”字符串到大小写对象转换))

不,不会自动生成这样的方法。您必须编写自己的
fromString
方法。请注意,您可以将其写得更简洁,如下所示:

object FlagReason {
  def fromString(value: String): Option[FlagReason] = {
    Vector(Spam, Illegal, CopyRightViolation, Other).find(_.toString == value)
  }
}
P>可选的,你可以考虑使用它来提供这个功能。

object FlagReason extends Enumeration {
  val Spam, Illegal, CopyRightViolation, Other = Value
}
然后,您可以使用
FlagReason with name”“
获取特定的枚举值,或者使用
Try(FlagReason with name”“)作为
选项安全地获取特定的枚举值。但是如果
不是有效的名称,它将抛出异常。因此,当您不确定名称是否有效时,使用
选项[FlagReason]
是一种稍微安全一点的处理方法:

scala> def parse(name: String) = FlagReason.values.find(_.toString == name)
parse: (name: String)Option[FlagReason.Value]

scala> parse("Spam")
res0: Option[FlagReason.Value] = Some(Spam)

scala> parse("NonExisting")
res1: Option[FlagReason.Value] = None

请注意,您的链接显示C#enum。顺便说一句,你能提供一个场景,在那里你真的需要这样一个功能吗?@agilesteel:我现在已经修复了链接,谢谢。我还添加了一些关于我为什么进行这种转换的信息。谢谢,像
扩展枚举
这样的东西正是我所希望的:-)
scala> def parse(name: String) = FlagReason.values.find(_.toString == name)
parse: (name: String)Option[FlagReason.Value]

scala> parse("Spam")
res0: Option[FlagReason.Value] = Some(Spam)

scala> parse("NonExisting")
res1: Option[FlagReason.Value] = None