2012-09-22 8 views
39

Ho provato la ricerca su Google e non sono riuscito a trovare un esempio decente forall. Che cosa fa? Perché richiede una funzione booleana?Scala per tutti gli esempi?

Prego indicarmi un riferimento (eccetto lo Scaladoc).

+6

http://www.scala-lang.org/api/current/scala/collection/immutable/List.html: 'Verifica se un predicato vale per tutti gli elementi di questo elenco. – MikkoP

+1

forse sei confuso perché hai pensato della funzionalità di 'foreach' invece (itera su tutti gli elementi) –

+1

Sì, stavo pensando che fosse una versione parallela di foreach. – Jus12

risposta

64

Il metodo forall accetta una funzione p che restituisce un booleano. La semantica di forall dice: restituire true se per ogni x nella raccolta, p(x) è true.

Quindi:

List(1,2,3).forall(x => x < 3) 

significa: true se 1, 2, e 3 sono meno del 3, false altrimenti. In questo caso, si valuterà di false dato che non è il caso di tutti gli elementi sono meno di 3: 3 è non inferiore a 3.

C'è un metodo simile exists che restituisce true se c'è almeno un elemento x nella raccolta in modo che p(x) sia vero.

Quindi:

List(1,2,3).exists(x => x < 3) 

significa: true se almeno uno di 1, 2, e 3 è inferiore a 3, false altrimenti. In questo caso, valuterà a true dato che alcuni elementi sono meno di 3: ad es. 1 è inferiore a 3.

+2

quindi 'forall (foo)' è equivalente a 'foldLeft (true) ((x, y) => x & foo (y))' – Jus12

+5

@ Jus12, sì, con la correzione che usa '&&' perché lo fa valutazione di cortocircuito (smette di valutare 'pippo' se trova un' falso'). – dhg

3

Un rapido esempio di come è possibile giocare con questa funzione utilizzando uno script Scala.

creare un file myScript.scala con

println(args.forall(p => (p.equals("a")))) 

e lo chiamano con

scala myScript.scala a a a // true 
scala myScript.scala a b c // false 
+4

perché non utilizzare il REPL? –

0

anche bene ricordare che all'interno della vostra chiusura è possibile eseguire più comandi ad esempio l'assegnazione di fuori delle variabili di scope

def main(args: Array[String]){ 
var country = "" 
var environment = "" 

val isValid = args.sliding(2, 2).forall{ 
    case Array("--env", value : String) => { 
    environment = value 
    Array("test", "staging", "prod").contains(value.toLowerCase()) 
    } 
    case Array("--country", value : String) => { 
    country = value 
    Array("BE", "NL", "FR").contains(value.toLowerCase()) 
    } 
    case _ => false 
} 

if(!isValid){ 
    println ("Wrong usage. Please insert params in the following format: --country {NL,BE,UK,FR} --env {test, staging, prod}") 
    return 
} 
else 
    println (s"Correct usage. env=$environment country=$country") 

}

Problemi correlati