Scala で、文字列からケース オブジェクトを自動的に解析する方法はありますか? 組み込みまたは自動生成された 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
そして、次のように動作する自動生成関数があるかどうか疑問に思っています:
FlagReason.fromString(value: String): FlagReason
where はケース オブジェクトFlagReason("Spam")
を返しますSpam
。
もしそうなら、私は自分で書く必要はありません。私は自分で書きました。
object FlagReason {
def fromString(value: String): FlagReason = value match {
case "Spam" => Spam
case "Illegal" => Illegal
case "CopyrightViolation" => CopyrightViolation
case "Other" => Other
}
}
背景: ケース オブジェクトを、HTML フォームのラジオ ボタンの値として使用する文字列に変換しています。送信されたフォームを処理するときに、選択した値をケース オブジェクトに戻しています。
関連情報: これは実際に Java 列挙型で可能です。たとえば、この StackOverflow の質問を参照してください。文字列値による列挙型の検索
((私は Scala のパーサー コンビネータを探しているわけではないと思います。それらを使用する場合、組み込みの「自動」文字列から case オブジェクトへの変換ではなく、解析ルールを自分で定義する必要があると思います))
ベストアンサー1
いいえ、そのようなメソッドは自動的に生成されません。独自のfromString
メソッドを記述する必要があります。次のように、より簡潔に記述できることに注意してください。
object FlagReason {
def fromString(value: String): Option[FlagReason] = {
Vector(Spam, Illegal, CopyRightViolation, Other).find(_.toString == value)
}
}
代わりに、scala.Enumeration
この機能を提供します。
object FlagReason extends Enumeration {
val Spam, Illegal, CopyRightViolation, Other = Value
}
次に、 を使用して特定の列挙値を取得するFlagReason withName "<name>"
か、 を使用して安全に としてOption
取得できますTry(FlagReason withName "<name>").toOption
。