Enums y casos
Variantes con datos y casos exhaustivos.
Un enum es un valor que puede ser una de varias variantes; cada una puede llevar un dato con tipo explícito.
enum Figura
Circulo decimal
Cuadrado decimal
Punto
casos debe cubrir todas las variantes (o terminar en _). Con |dato| accedes al dato de la variante:
fn area(figura Figura) decimal
casos figura |dato|
.Circulo => 3.14159 * dato * dato
.Cuadrado => dato * dato
.Punto => 0
Se construyen con Figura.Circulo(1), o solo .Circulo(1) cuando el tipo esperado es evidente. Para comprobar una variante sin dato basta ==: si luz == .Rojo.
Programa completo
// Enums: un valor que puede ser una de varias opciones.
enum Semaforo
Verde
Amarillo
Rojo
// Una variante puede llevar un dato.
enum Figura
Circulo decimal
Cuadrado decimal
Punto
// casos elige qué hacer según la variante y debe cubrirlas todas.
fn accion(luz Semaforo) cadena
casos luz
.Verde => "avanzar"
.Amarillo => "precaución"
.Rojo => "detenerse"
// |dato| da acceso al valor que lleva la variante.
fn area(figura Figura) decimal
casos figura |dato|
.Circulo => 3.14159 * dato * dato
.Cuadrado => dato * dato
.Punto => 0
fn inicio()
var luz = Semaforo.Rojo
imprimir(accion(luz))
imprimir(accion(.Verde))
var figuras = [Figura.Circulo(1), Figura.Cuadrado(3), Figura.Punto]
repetir (figuras) |figura|
imprimir(area(figura))
// _ cubre el resto de las variantes.
casos luz
.Rojo => imprimir("¡Alto!")
_ => imprimir("Puedes seguir")
// Para comprobar una sola variante basta con ==.
si luz == .Rojo
imprimir("El semáforo está en rojo")