2016-05-15 14 views
2

Sagen Sie wünschen Musterabgleich verwenden, wenn eine Methode mit varargs wie so Aufruf:Standard leer Fall für varargs

def foo(bar: Int*) = ??? 

val x = false 
foo(x match { 
    case true => 1 
    case _ => 
}) 

Ausführen der obigen Code führt Typenkonfliktfehler, da foo ein Argument vom Typ erfordert Int aber gefunden Unit stattdessen im Standardfall. Das Entfernen des Standardfalls führt jedoch zu einer Warnung, dass die Übereinstimmung möglicherweise nicht vollständig ist, und zwar zu Recht.

Meine Frage ist, wie liefere ich einen leeren Standardfall für die Übereinstimmung (die würde foo() ohne Argumente aufrufen)?

+0

Wenn Sie nur eine einzige Int übergeben, warum Varargs verwenden? –

+0

@YuvalItzchakov das Beispiel gegeben ist ein MWE, der eigentliche Anwendungsfall ist komplizierter – 0sh

+0

Wenn diese MWE nicht Ihr wirkliches Problem ist, können wir möglicherweise nicht die beste Lösung bieten, da wir nur einen "nahen Verwandten" von sehen das eigentliche Problem. –

Antwort

3

Sie könnten das Übereinstimmungsergebnis in einer Sequenz erfassen und den Mangel an Argumenten als leer darstellen. Dann vollzuspritzen nur das Ergebnis in den Parameter:

def foo(bar: Option[Int]*) = ??? 

val x = false 
foo(x match { 
    case true => Some(1) 
    case _ => None 
}) 

Ich denke, ein if-else Ausdruck weniger ausführlich sein würde hier:

val x = true 
foo((x match { 
    case true => Seq(1) 
    case _ => Seq.empty 
}):_*) 
+1

Es kann besser lesbar sein als 'val args = x match ...; foo (args: _ *) '. –

+0

Sicher ist. Wenn es so komplex wie OPs Kommentar (20+ Werte) suggeriert, kann es sogar eine eigene Methode garantieren, um die Dinge sauber zu halten. Aber offensichtlich sehen wir nicht das ganze Bild. – alextsc

2

Eine Möglichkeit eine Option[Int] anstelle eines Int zu verwenden wäre

foo(if (x) Some(1) else None) 

Ich würde aber argumentieren, dass, wenn Sie über eine einzige passen, es keinen Sinn hat Varargs überhaupt zu passieren.