有没有办法在Scala中自动解析字符串中的case对象?使用一些内置/自动生成的Scala函数?
例如,我有这些案例对象:( 请注意,有一个密封的父类)
abstract sealed class FlagReason
case object Spam extends FlagReason
case object Illegal extends FlagReason
case object CopyrightViolation extends FlagReason
case object Other extends FlagReason
Run Code Online (Sandbox Code Playgroud)
我想知道是否有一些自动生成的功能,如下所示:
FlagReason.fromString(value: 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
}
}
Run Code Online (Sandbox Code Playgroud)
背景:我正在将我的case对象转换为我用作html表单中的单选按钮值的字符串.当我处理提交的表单时,我正在将选定的值转换回case对象.
相关信息:这实际上可以使用Java枚举,请参阅此StackOverflow问题:按字符串值查找枚举
((我不认为我在寻找Scala的Parser Combinators.我想我要使用它们我仍然需要自己定义解析规则,而不是内置"自动"字符串到case对象转换) )
mis*_*tor 28
不,不会自动生成此类方法.你必须编写自己的fromString
方法.请注意,您可以更紧凑地编写它,如下所示:
object FlagReason {
def fromString(value: String): Option[FlagReason] = {
Vector(Spam, Illegal, CopyRightViolation, Other).find(_.toString == value)
}
}
Run Code Online (Sandbox Code Playgroud)
或者,您可以考虑使用scala.Enumeration
哪个提供此功能.
object FlagReason extends Enumeration {
val Spam, Illegal, CopyRightViolation, Other = Value
}
Run Code Online (Sandbox Code Playgroud)
然后,你可以获得与特定枚举值FlagReason withName "<name>"
,或安全作为Option
与Try(FlagReason withName "<name>").toOption
.