2016-08-28 1 views
0

Ich möchte überprüfen, ob zwei Variablen in beliebiger Reihenfolge zu einem bestimmten Paar gepaart werden können. Grundsätzlich unterhalb der, nur, dass es nicht wegen der Typ Löschung arbeiten zur LaufzeitScala: Prüfe die Kombination zweier Variablen

def combination[A,B](x: Any, y: Any): Option[(A, B)] = 
    (x, y) match { 
    case (a: A, b: B) => Some(a, b) 
    case (b: B, a: A) => Some(a, b) 
    case _ => None 

Gibt es eine andere Möglichkeit, das gleiche zu tun, die funktionieren würde ...

+0

Können Sie den Typ der beiden Argumente begrenzen? – Anton

Antwort

5

Hinweis, da nicht klar war, in wenn Sie Ihre Nachricht, wollen Muster-Match gegen ein Paar Konstanten (a, b), können Sie prüfen, back-ticks statt, was Sie tun:

case (`a`, `b`) => Some(a, b) 

auf der anderen Seite wenn Sie versuchen, die Elemente eines Paares beliebiger Werte von t zu erhalten y (A, B), in beliebiger Reihenfolge, können Sie es für nicht-primitive Typen (d. h. Untertypen von AnyRef):

import scala.reflect.ClassTag 
def combination[A, B](x: AnyRef, y: AnyRef)(implicit tagA: ClassTag[A], tagB: ClassTag[B]): Option[(A, B)] = (x, y) match { 
    case (a: A, b: B) => Some(a, b) 
    case (b: B, a: A) => Some(a, b) 
    case _ => None 
} 
+0

Perfekt das ist was ich brauchte. –

Verwandte Themen