2017-04-23 6 views
4

Wenn ich Scala Tupel Option von Künstlern wie:Scala Tuple Option

(Some(1), None) 
(None, Some(1)) 
(None, None) 

Und ich will immer immer den „Some“ Wert extrahieren, wenn es vorhanden ist, und andernfalls die keine bekommen. Der einzige Weg mit Mustererkennung?

+0

Welches Ergebnis wollen Sie von diesen Tupeln? Was ist, wenn beide "Einige" (Einige (1), Einige (2)) sind? – Psidom

+0

@Psidom Aufgrund der Natur meines Problems ist es unmöglich, diesen Fall zu haben. Ich habe mich gefragt, ob Tupel mit Optionen ein ähnliches Verhalten wie p/\! P == False hatten. – Alessandroempire

+0

Die Ausgabe, die Sie wollen, ist immer noch eine Option, oder? – mfirry

Antwort

10

Es ist dies:

dass die erste Option wird zurückkehren, die definiert ist, oder keine, wenn weder ist.

Edit:

Ein anderer Weg, um die gleiche Sache Begriff ist

def oneOf[A](tup: (Option[A], Option[A])) = 
    tup match { case (first, second) => first.orElse(second) } 

Es ist länger, aber vielleicht besser lesbar.

4

sollte diese Arbeit:

def f(t: (Option[Int], Option[Int])): Option[Int] = t match { 
    case (Some(n), _) => Some(n) 
    case (_, Some(n)) => Some(n) 
    case _ => None 
} 
2

Ich will immer immer den Some Wert zu extrahieren, wenn es vorhanden ist, und sonst bekommen die None

Sie haben soeben orElse

def orOption[T](p: (Option[T], Option[T])): Option[T] = { 
    val (o1, o2) = p 
    o1 orElse o2 
} 

jedoch verwenden können, das, was entscheidet zu tun wenn es zwei Some Werte gibt:

scala> orOption((Some(1), Some(2))) 
res0: Option[Int] = Some(1) 

Sie sollten wahrscheinlich Mustererkennung verwenden und dann entscheiden, was zu tun ist, wenn es zwei Some Werte gibt, wie eine Ausnahme werfen. Verwenden Sie alternativ eine bessere Codierung für den Ergebnistyp als Option.