2011-09-23 14 views
16

文字列からケースオブジェクトを自動的に解析する方法はありますか?内蔵の/自動生成されたScala関数を使用していますか?Scalaのcaseオブジェクトに文字列を解析する機能が組み込まれていますか?

例えば、私は、これらのケースは、オブジェクトを持っている:

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

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の質問:Lookup enum by string value

(私はスカラーのパーサーコンビネータを探しているとは思いませんが、私はそれを使用していたと思います。 "自動"文字列からケースへのオブジェクト変換))

+0

注意、あなたのリンクは、C#の列挙型を示すこと。 Btw、あなたは実際にそのような機能が必要なシナリオを提供できますか? – agilesteel

+0

@agilesteel:今、リンクを修正しました。ありがとうございます。なぜ私はそのような変換を行うのかについての情報を追加しました。 – KajMagnus

答えて

25

いいえ、このような方法は自動的に生成されません。独自の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>"、または安全Try(FlagReason withName "<name>").toOptionOptionなどで特定の列挙値を取得することができます。

+0

おかげさまで、 'extends Enumeration'のようなものは、私が望んでいたもののようなものでした:-) – KajMagnus

3

missingfaktorが指摘する通り、FlagReason withName "<name>"は必要な処理を行う必要があります。しかし、<name>が有効な名前でない場合、例外がスローされます。あなたがわからないときに名前が有効であれば、少しより安全な方法はこれを処理するためにOption[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 
関連する問題