2016-08-20 7 views
3

Ich habe eine Funktion erstellt, um einen bestimmten Wert aus dem Pascal-Dreieck abzurufen, und ich habe if Anweisungen verwendet. Jetzt möchte ich die Funktion umwandeln, um Mustervergleiche zu verwenden.Scala-Mustervergleich mit Tupel: Übereinstimmende gleiche Werte im Tupel

Meine if basierte Funktion sieht wie folgt aus:

def valueAt(row: Int, column: Int): Int = { 
    // ... 
    else if (row == column) 1 // last column 
    // 
} 

Meine zweite Version dieser Funktion, Pattern-Matching verwendet, hat die folgende Signatur:

def valueAt2(row: Int, column: Int): Int = (row, column) match { 
    // ... 
} 

Ist es möglich, eine definieren case für, wenn die row und column haben den gleichen Wert?

ich die gleichen Variablennamen in den case, wie diese verwendet hat versucht:

case (x, x) => 1 // last column 

Und ich habe auch versucht, den Wert der row in der Spalte zu verwenden, wie folgt aus:

case (_, row) => 1 // last column 

Aber sie funktionieren nicht. Im ersten Fall habe ich einen Kompilierungsfehler und in der zweiten sagt die IDE, dass ich die Variable row von der match überschattete.

Ist das möglich?

Danke.

Antwort

3

Für die erste, verwenden Sie ein, wenn Wache:

(1, 2) match { case (x, y) if x == y => 1; ... } 

Für die zweite, wenn Sie eine Variable (anstelle von Bindung und Shadowing-it) entsprechen möchten, können Sie Backticks verwenden (`):

(1, 2) match { case (_, `row`) => 1; ... } 
2

können Sie verwenden, um eine Wache, die ein Teil eines Falles Ausdruck ist, der nicht stabilen Bedingungen überprüfen, und nicht überraschend ähnelt ein if Aussage:

(row, column) match { 
    case (x, y) if x == y => 1 
    // other cases... 
} 

Beachten Sie, dass nicht diese Wache Eingänge für: (dh für welche x != y) würde weiterhin die anderen Fälle zu überprüfen, so kann zum Beispiel ein weiterer Fall case (x, y) => ... folgen, und davon ausgehen, x != y.