ejemplos - listas en scala
Escribiendo funciones de tuplas convenientemente en Scala (6)
Algunas funciones en el Map
toman una función en una tupla de valor-clave como argumento. Por ejemplo, def foreach(f: ((A, B)) ⇒ Unit): Unit
. Así que busqué una forma corta de escribir un argumento para foreach
:
> val map = Map(1 -> 2, 3 -> 4)
map: scala.collection.immutable.Map[Int,Int] = Map(1 -> 2, 3 -> 4)
> map.foreach((k, v) => println(k))
error: wrong number of parameters; expected = 1
map.foreach((k, v) => println(k))
^
> map.foreach({(k, v) => println(k)})
error: wrong number of parameters; expected = 1
map.foreach({(k, v) => println(k)})
^
> map.foreach(case (k, v) => println(k))
error: illegal start of simple expression
map.foreach(case (k, v) => println(k))
^
puedo hacer
> map.foreach(_ match {case (k, v) => println(k)})
1
3
¿Alguna alternativa mejor?
En tales casos a menudo utilizo la sintaxis.
for ((k,v) <- map) println(k)
De acuerdo con el Capítulo 23 en "Programación en Scala", el bucle anterior de for se traduce para llamar a foreach
.
Estuve bastante cerca con el último intento, en realidad:
> map.foreach({case (k, v) => println(k)})
1
3
También puede acceder a una tupla de la siguiente manera:
scala> val map = Map(1 -> 2, 3 -> 4)
map: scala.collection.immutable.Map[Int,Int] = Map((1,2), (3,4))
scala> map foreach (t => println(t._1))
1
3
Una alternativa es el método tupled
del objeto Function
:
import Function.tupled;
// map tupled foreach {(k, v) => println(k)}
map foreach tupled {(k, v) => println(k)}
map.foreach(case (k, v) => println(k))
muy cerca con map.foreach(case (k, v) => println(k))
. Para usar el case
en una función anónima, rodéalo con llaves.
map foreach { case (k, v) => println(k) }
Welcome to Scala version 2.8.0.Beta1-prerelease (OpenJDK Server VM, Java 1.6.0_0).
Type in expressions to have them evaluated.
Type :help for more information.
scala> val m = Map(''a -> ''b, ''c -> ''d)
m: scala.collection.immutable.Map[Symbol,Symbol] = Map(''a -> ''b, ''c -> ''d)
scala> m foreach { case(k, v) => println(k) }
''a
''c