文字列をScalaケースオブジェクトに解析する機能が組み込まれていますか? 質問する

文字列をScalaケースオブジェクトに解析する機能が組み込まれていますか? 質問する

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

おすすめ記事