2012-09-22 15 views
39

Probé la búsqueda de Google y no pude encontrar un ejemplo decente forall. ¿Qué hace? ¿Por qué toma una función booleana?Scala por ejemplo?

Por favor, indíqueme una referencia (excepto el Scaladoc).

+6

http://www.scala-lang.org/api/current/scala/collection/immutable/List.html: 'Comprueba si un predicado es válido para todos los elementos de esta lista. – MikkoP

+1

tal vez te confundiste porque pensabas de la funcionalidad de 'foreach' en su lugar (iterar a través de todos los elementos) –

+1

Sí, estaba pensando que es una versión paralela de foreach. – Jus12

Respuesta

64

El método forall toma una función p que devuelve un valor booleano. La semántica de forall dice: return true if por cada x en la colección, p(x) es verdadero.

Así:

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

significa: true si es 1, 2, y 3 son de menos de 3, false lo contrario. En este caso, se evaluará a false ya que no es el caso de todos los elementos están a menos de 3: 3 no es inferior a 3.

Hay un método similar exists que devuelve true si hay al menos un elemento x en la colección tal que p(x) es verdadero.

Así:

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

significa: true si al menos uno de 1, 2, y 3 es inferior a 3, false lo contrario. En este caso, se evaluará a true ya que es el caso de que algún elemento sea inferior a 3: p. Ej. 1 es menor que 3.

+2

así 'forall (foo)' es equivalente a 'foldLeft (true) ((x, y) => x & foo (y))' – Jus12

+5

@ Jus12, sí, con la corrección de que usa '&&' porque lo hace evaluación de cortocircuito (deja de evaluar 'foo' si encuentra un' false'). – dhg

3

Un ejemplo rápido de cómo se puede jugar con esta función usando un script Scala.

crear un archivo myScript.scala con

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

y lo llaman con

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

¿por qué no utilizar REPL? –

0

También es bueno recordar que dentro de su cierre puede ejecutar más comandos por ejemplo, la asignación de las variables de ámbito

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") 

}

Cuestiones relacionadas