2016-06-04 17 views
0

Wenn ich versuche, eine Variable auf seiner Art zu entsprechen, wie in dem folgenden Code:Fallklassen entsprechen vom Typ

object CaseClassesApp extends App { 

    sealed trait A{} 
    final case class B() extends A{} 
    final case class C() extends A{} 

    def tryMatch(x: Any): String = x match { 
    case B => "It's a B!" 
    case C => "It's a C!" 
    case _ => "nope" 
    } 

    var testB = new B() 
    print(tryMatch(testB)) 
} 

Sollte es mir nicht geben: „Es ist ein B!“? Warum bekomme ich stattdessen ein "Nein"?

Antwort

3

Wenn Sie Match eingeben möchten, können Sie es implementieren, indem Sie den Code nur ein wenig ändern.

def tryMatch(x: Any): String = x match { 
    case b:B => "It's a B!" 
    case c:C => "It's a C!" 
    case _ => "nope" 
} 
+1

Da Sie die Werte nicht verwenden, sollten Sie 'b: B' durch' _: B' (gleiches für 'c') ersetzen können. –

+0

@sedulam Ich habe den modifizierten Code in meine IDE eingefügt, es funktioniert. Vielleicht ist der Link http://www.artima.com/pins1ed/case-classes-and-pattern-matching.html hilfreich und suchen Sie "typisierte Muster" in der html – Jerry

+0

@ AngeloGenovese, ja, danke für Ihre Kommentare – Jerry

1

Das Muster Spiel sollte sein:

def tryMatch(x: Any): String = x match { 
    case B() => "It's a B!" 
    case C() => "It's a C!" 
    case _ => "nope" 
    } 

, weil Sie ein Objekt übereinstimmen soll kein Typ.

wenn Sie Typ passen möchten, können Sie TypeTag verwenden, wie:

import scala.reflect.runtime.universe._ 
    def tryMatch[T](x: T)(implicit t: TypeTag[T]): String = x match { 
    case _ if t.tpe =:= typeOf[B] => "It's a B!" 
    case _ if t.tpe =:= typeOf[C] => "It's a C!" 
    case _ => "nope" 
    } 
+0

Eigentlich möchte ich einen Typ zuordnen :) Wie würde das bitte gehen? –

+0

Macht nichts, ich habe es. Prost! –

+0

@sedulam, wenn Sie den Typ anpassen möchten, können Sie 'TypeTag' verwenden, um es von scala 2.10 aus zu tun. – chengpohi

0

Die anderen Antworten erklären, wie man eszu beheben, aber nicht, was das Problem tatsächlich ist. Jede case class hat automatisch einen Begleiter object mit dem gleichen Namen, so funktioniert case B funktioniert genau wie case None bei der Zuordnung eines Option: es ist abgestimmt, wenn x ist gleich diesem Objekt! Wenn Sie x: Any durch x: A ersetzen, wird der Compiler Ihnen sagen, dass die Übereinstimmung möglicherweise nicht funktionieren kann, da das Objekt B keine Instanz von A ist.

Verwandte Themen