Parsing 将字符串内置解析为Scala case对象?
在Scala中,有没有办法从字符串自动解析case对象?使用一些内置/自动生成的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)
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