Frage

ich auf das folgende Muster gelegentlich kommen, wo ich im Wesentlichen eine PartialFunction[SomeType,AnotherType], und wollen es als Function[SomeType,Option[AnotherType] zu behandeln, zum Beispiel:

def f(s:SomeType):Option[AnotherType] = s match {
  case s1:SubType1 => Some(AnotherType(s1.whatever))
  case s2:SubType2 => Some(AnotherType(s2.whatever))
  case _ => None
}

Gibt es eine Möglichkeit die obige Funktion in einer Art und Weise zu schreiben, die die Standard-Fall und Verpackung das Ergebnis in Some vermeidet, wo er definiert wird? Das Beste, was ich mit so weit habe kommen, ist dies:

def f(s:SomeType):Option[AnotherType] = pf.lift(s)
def pf:PartialFunction[SomeType,AnotherType] = {
  case s1:SubType1 => AnotherType(s1.whatever)
  case s2:SubType2 => AnotherType(s2.whatever)
}

Gibt es eine Möglichkeit, es zu tun, ohne eine Zwischenfunktion zu definieren? Ich habe schon verschiedene Dinge nach dem Vorbild der folgenden versucht, habe aber noch nichts bekommen zu kompilieren noch:

def f:Function[SomeType,Option[AnotherType]] = {
  case s1:SubType1 => AnotherType(s1.whatever)
  case s2:SubType2 => AnotherType(s2.whatever)
}.lift
War es hilfreich?

Lösung

condOpt in Objekt scala.PartialFunction. Vom scaladoc:

def onlyInt(v: Any): Option[Int] = condOpt(v) { case x: Int => x }

Andere Tipps

Nicht so sehr eine Antwort, wie eine Erklärung, warum huynhjl Antwort richtig ist ...

Ein Teil Ihrer Verwirrung ist, dass Sie versuchen, eine Teilfunktion def. dies tut, ist alles ein Verfahren, dass die Rendite eines PartialFunction-Objekt zu erstellen, wenn Sie die Sache auch schaffen können direkt an:

val pf: PartialFunction[SomeType,AnotherType] = {
  case s1:SubType1 => AnotherType(s1.whatever)
  case s2:SubType2 => AnotherType(s2.whatever)
}

Obwohl ich persönlich Nutzungsart Zuschreibung bevorzugen:

val pf = {
  case s1:SubType1 => AnotherType(s1.whatever)
  case s2:SubType2 => AnotherType(s2.whatever)
} : PartialFunction[SomeType,AnotherType]

So oder so, müssen Sie angeben, welche der Eingabetyp ist, so dass Sie die genaue Unterschrift des PartialFunction geben. Ich weiß, es fühlt sich an wie soll es möglich sein, dies abzuleiten, aber ach, das leider nicht der Fall ist!

Mit der zugeschriebenen Version können Sie dann definieren und heben alle im selben Ort:

val pf = ({
  case s1:SubType1 => AnotherType(s1.whatever)
  case s2:SubType2 => AnotherType(s2.whatever)
} : PartialFunction[SomeType,AnotherType]).lift

PartialFunction.condOpt ist die bessere Lösung aber, wie es die Rückschließer können die meisten dieser Arbeit für Sie zu tun, viel sauberer Code verlassen:)

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top