2010-11-06 13 views

risposta

2

Immagino che stiate cercando match (o semplicemente semplicemente if/else if/else).

2
case class Paired(x: Int, y: Int) 

def foo(x: Any) = x match { 
    case string : String => println("Got a string") 
    case num : Int if num < 100 => println("Number less than 100") 
    case Paired(x,y) => println("Got x and y: " + x + ", " + y) 
    case unknown => println("??: " + unknown) 
} 

Le prime due istruzioni case mostrano la corrispondenza del modello in base al tipo. Il terzo mostra l'uso di un estrattore per suddividere i dati in parti costituenti e assegnarle a variabili. Il terzo mostra una corrispondenza di pattern variabile che corrisponderà a qualsiasi cosa. Non mostrato è il caso _:

case _ => println("what") 

che come il pattern match variabile, corrisponde a qualsiasi cosa, ma non vincola l'oggetto abbinato a una variabile.

La classe case in alto è una scorciatoia Scala per la creazione di un estrattore e della classe stessa.

1

Ovviamente, né matchif fa esattamente la stessa cosa di cond. Una possibilità è quella di fare in questo modo:

object Cond { 
    def apply(clauses: Iterable[(()=>Boolean,()=>Any)]): Any = { 
    clauses find (_._1()) map (_._2()) getOrElse() 
    } 
} 

Questo oggetto accetta qualcosa Iterable in cui ogni elemento è una coppia di una funzione che restituisce booleano e una funzione che restituisce Qualsiasi. Prova a trovare un oggetto la cui prima funzione restituisce true, smette di cercare se ne trova una, chiama la seconda funzione su un elemento trovato e restituisce il risultato di tale funzione (o() se non ne è stato trovato nessuno).

Esempi:

val clauses = Seq(
    ({()=>false}, {()=>println("foo")}), 
    ({()=>true}, {()=>println("bar")}) 
) 
Cond(clauses) 

def checkYear(year: Int) = { 
    Cond(Seq(
    ({()=>year % 400 == 0}, {()=>42}), 
    ({()=>true}, {()=>{c:Char => (c.toString * 3)}}) 
)) 
} 

ETA: Sì, lo so che è brutto, ma funziona.