domingo, 28 de mayo de 2017

Un resumen de Scala for the Impatient, parte 18


Enumeraciones

Al contrario de java o c++, Scala no cuenta con enumeraciones. Pero la librería estándar de scala cuenta con una clase Enumeration, que nos ayudara a trabajar con enumeraciones.

Lo que tenemos que hacer es un objeto que extienda de la clase Enumeration:

object TrafficLightColor extends Enumeration {
  val Red, Yellow, Green = Value
}

Este objeto tiene 3 propiedades Red, Yellow, Green inicializadas como valor. Alternativamente se le puede pasar al valor un id y un nombre o las dos cosas:

val Red = Value(0, "Stop")
val Yellow = Value(10) // Name "Yellow"
val Green = Value("Go") // ID 11

Si no se especifica el id, se asignara uno más del asignado previamente y por defecto el nombre es el nombre del campo.

Ahora usted se puede referirse a la enumeración TrafficLightColor como TrafficLightColor.Red, TrafficLightColor.Yellow, TrafficLightColor.Green. Si esto resulta tedioso, puede importar la clase:

import TrafficLightColor._

Hay que recordar que los valores Red, Green y Yellow son de tipo Value, no TrafficLightColor, si se  quiere se puede definir un alias:

object TrafficLightColor extends Enumeration {
type TrafficLightColor = Value
val Red, Yellow, Green = Value
}

Ahora el tipo TrafficLightColor.TrafficLightColor, se va importar y podremos usarlo:

import TrafficLightColor._

def doWhat(color: TrafficLightColor) = {
if (color == Red) "stop"
else if (color == Yellow) "hurry up"
else "go"
}

El id es el valor retornado cuando se llama a la enumeración y el nombre es lo que se llama cuando se llama al método toString

Si llamamos a TrafficLightColor.values podremos obtener todos los valores:

for (c <- TrafficLightColor.values) println(c.id + ": " + c)

Para terminar, podemos buscar un valor por id o nombre, si deseamos buscar el valor Red :
TrafficLightColor(0) // Calls Enumeration.apply
TrafficLightColor.withName("Red")