2010-02-06 9 views
11

Muy práctico código Ruby:equivalente a Scala del mapa de Ruby. Cada uno?

some_map.each do |key,value| 
    # do something with key or value 
end 

Scala equivalente:

someMap.foreach(entry => { 
    val (key,value) = entry 
    // do something with key or value 
}) 

tener que añadir el extra val errores de línea de mí. No podía encontrar la manera de indicar la función arg para extraer la tupla, por lo que me pregunto es que hay una manera de hacer esto, o por qué no hay foreach que extrae la clave y el valor para mí?

Respuesta

19

Esto funciona, también:

someMap.foreach {case (key, value) => 
    // do something with key and/or value 
} 
+0

Una declaración de caso es realmente una función parcial en el disfraz es por qué funciona esta práctica taquigrafía de descomposición. Eso podría ayudar a alguien que está desconcertado por el tipo de error que resulta de no coincidir con este tipo de expresión. –

+0

Buen artículo sobre funciones parciales aquí http://ebruchez.blogspot.com/2011/10/scala-partial-functions-without-phd.html – foolshat

11

I como éste:

scala> val foo = Map(1 -> "goo", 2 -> "boo") 
foo: scala.collection.immutable.Map[Int,java.lang.String] = Map(1 -> goo, 2 -> boo) 

scala> for ((k,v) <- foo) println(k + " " + v) 
1 goo 
2 boo 
+0

No hay necesidad de '' val' en el interior del generador de for'. –

5

No es necesario incluso el val en bucle:

Siguiendo el ejemplo de ViktorKlang:

scala> val foo = Map(1 -> "goo", 2 -> "boo") 
foo: scala.collection.immutable.Map[Int,java.lang.String] = Map(1 -> goo, 2 -> boo) 

scala> for ((k, v) <- foo) println(k + " " + v) 
1 goo 
2 boo 

Tenga en cuenta que for es bastante potente en Scala, por lo que también se puede utilizar para sequence comprehensions:

scala> val bar = for (val (k, v) <- foo) yield k 
bar: Iterable[Int] = ArrayBuffer(1, 2) 
+0

'for' es en realidad una comprensión Mónada disfrazado de' bucle for', a fin de no ahuyentar a los programadores de Java con conceptos tales como mónada * *. (Al igual que por comprensión de la consulta en C#/VB.NET son sólo comprensiones monad disfrazados de consultas SQL.) Por lo tanto, es aún más potente que la secuencia de comprensiones. –

+1

Jörg, no use la palabra M, que asusta a la gente ;-) –

+0

@ViktorKlang: Exactamente! Es por eso que Martin Odersky los disfrazó como algo que los programadores de Java ya saben: un ciclo 'for'. Y Erik Meijer los disfrazó como una consulta SQL en C# y VB.NET, Don Syme los disfrazó como una tubería de shell de Unix en F #, Simon Peyton Jones los disfrazó como un bloque C en Haskell. (A veces creo que serían * menos * aterradores si no estuvieran constantemente escondidos en las sombras ...) –

2

Function.tupled convierte una función (a1, a2) => b) a una función ((a1, a2)) => b.

import Function._ 
someMap foreach tupled((key, value) => printf("%s ==> %s\n", key, value)) 
Cuestiones relacionadas