2017-09-06 22 views
0

私は定数のパターンマッチングを試みています。 私はAnyとしてc3の戻り値の型を取得しますが、私はそれが私はそれはあなたがあなたの中に、他のケースが欠落しているNoneパターンマッチングは戻り値の型をAnyとして返します

object Currency { 

    sealed trait Currency {def name: String} 

    case object EUR extends Currency {val name = "EUR"} 

    //etc. 
    case object INR extends Currency {val name = "INR"} 

    //etc. 

    val list = Seq(EUR, INR) 

    def currency(name: String): Option[Currency] = list.find(_.name == name) 
    } 

    val c1=Currency.currency("INR") 
    val c3=if(c1.isDefined)c1.get match { 
    case Currency.INR => Currency.EUR 
    case Currency.EUR=> Currency.INR 
    } 

答えて

1

にエラーを投げることができるisDefinedを使用しない場合はOption

を返すようにしたいですif文。オプションを返す場合。

val c3=if(c1.isDefined){ 
     c1.get match { 
     case Currency.INR => Some(Currency.EUR) 
     case Currency.EUR=> Some(Currency.INR) 
    } 
    else None 

ただし、これはOptionの使い方が悪いです。存在を確認し、値を抽出してから、それを元に戻すことは、決して行うべきではありません。この場合は、何が欲しいのはmap

val c3 = c1.map{ 
    case Currency.INR => Currency.EUR 
    case Currency.EUR => Currency.INR 
    } 

があなたのマッピングに応じて更新された値を含むOption[Currency]を返しますし、Noneオプションは何もなかった場合。

コンテンツが大文字小文字に含まれていない通貨である場合は、一致例外がスローされることに注意してください。このケースでは、封印された特性を使用しているため、これは徹底的に一致しているため、問題はありません。

しかし必要な場合は、そのシナリオをカバーするために、デフォルトのケースを含めることができ、

val c3 = c1.map{ 
    case Currency.INR => Currency.EUR 
    case Currency.EUR => Currency.INR 
    case _ => Currency.INR //catch-all. Anything not covered in previous 
          cases will default to Currency.INR 
    } 

上記戻りSome(Currency.EUR)はC1であるSome(Currency.INR)はC1が他のSomeが含まれており、NoneはC1がNone

であり、 Some(Currency.INR)です

mapの代わりにcollectを使用して、一致するケースがない場合はNoneを返します。 c1はSome(Currency.INR)またはSome(Currency.EUR)

+0

以外であれば

val c3 = c1.collect{ case Currency.INR => Currency.EUR case Currency.EUR => Currency.INR } 

上記戻りNoneあなたはしかし、あなたはそのシナリオをカバーするために、デフォルトのケースを含めることができ、または収集使用の代わりに、一般的には最後のポイントを説明してくださいすることができます大文字と小文字が一致しない場合はNoneを返すようにマップします。 – coder25

+0

@ coder25回答を更新しましたが、何らかの点について明確化が必要な場合は教えてください – puhlen

+0

ok collectはコレクションを作成するのに使用されます。パターンマッチングで役立ちます – coder25

関連する問題