Cuando una variante de un tipo personalizado contiene datos, se le llama registro, y cada valor que contiene reside en un campo.
pub type Rectangle {
Rectangle(
Float, // The first field
Float, // The second field
)
}
Para facilitar la lectura, Gleam permite etiquetar los campos con un nombre.
pub type Rectangle {
Rectangle(
width: Float,
height: Float,
)
}
Las etiquetas se pueden usar para dar argumentos en cualquier orden al constructor de un registro.
let a = Rectangle(height: 10.0, width: 20.0)
let b = Rectangle(width: 20.0, height: 10.0)
a == b
// -> True
Cuando un tipo personalizado tiene solo una variante, se puede usar la sintaxis de acceso .label para obtener los campos de un registro.
let rect = Rectangle(height: 10.0, width: 20.0)
rect.height // -> 10.0
rect.width // -> 20.0
La sintaxis de actualización de registros se puede usar cuando un tipo personalizado tiene una sola variante para crear un registro nuevo a partir de uno existente, pero con algunos de los campos reemplazados por valores nuevos.
let rect = Rectangle(height: 10.0, width: 20.0)
let tall_rect = Rectangle(..rect, height: 50.0)
tall_rect.height // -> 50.0
tall_rect.width // -> 20.0
Las etiquetas también se pueden usar al hacer coincidencia de patrones para extraer valores de los registros.
pub fn is_tall(rect: Rectangle) {
case rect {
Rectangle(height: h, width: _) if h >. 20.0 -> True
_ -> False
}
}
Si solo queremos hacer coincidir algunos de los campos, podemos usar el operador de propagación .. para ignorar los campos restantes.
pub fn is_tall(rect: Rectangle) {
case rect {
Rectangle(height: h, ..) if h >. 20.0 -> True
_ -> False
}
}
En este ejercicio eres un gran fanático del deporte y acabas de descubrir tu pasión por el básquetbol de la NBA. Como eres nuevo en el básquetbol de la NBA, estás explorando a fondo la historia de la NBA, llevando un registro de equipos, entrenadores, sus estadísticas de victorias y derrotas, y comparándolos entre sí.
Como todavía no tienes un equipo favorito, también desarrollarás un algoritmo para determinar si conviene apoyar a un equipo en particular.
Tienes siete tareas que te ayudarán a desarrollar tu propio algoritmo apoyar a un equipo.
Define el registro Coach con los siguientes dos campos:
name: el nombre del entrenador, de tipo String.former_player: indica si el entrenador fue exjugador, de tipo Bool.Define el registro Stats con los siguientes dos campos:
wins: el número de victorias, de tipo Int.losses: el número de derrotas, de tipo Int.Define el registro Team con los siguientes tres campos:
name: el nombre del equipo, de tipo String.coach: el entrenador del equipo, de tipo Coach.stats: las estadísticas del equipo, de tipo Stats.Implementa la función create_coach, que recibe como parámetros el nombre del entrenador y su condición de exjugador, y devuelve su registro Coach:
create_coach("Larry Bird", True)
// -> Coach(name: "Larry Bird", former_player: True)
Implementa la función create_stats, que recibe como parámetros el número de victorias y el número de derrotas, y devuelve su registro Stats:
create_stats(58, 24)
// -> Stats(wins: 58, losses: 24)
Implementa la función create_team, que recibe como parámetros el nombre del equipo, el entrenador y el registro, y devuelve su registro Team:
let coach = create_coach("Larry Bird", True)
let stats = create_stats(58, 24)
create_team("Indiana Pacers", coach, stats)
// -> Team(
// name: "Indiana Pacers",
// coach: Coach(name: "Larry Bird", FormerPlayer = True),
// stats: Stats(wins: 58, losses: 24),
// )
Como los dueños de la NBA son impacientes, descubriste que los malos resultados del equipo a menudo llevaban a que se reemplazara al entrenador. Implementa la función replace_coach, que recibe como parámetros el equipo y su nuevo entrenador, y devuelve el equipo pero con el nuevo entrenador:
let coach = create_coach("Larry Bird", True)
let record = create_stats(58, 24)
let team = create_team("Indiana Pacers", coach, record)
let new_coach = create_coach("Isiah Thomas", True)
replace_coach(team, new_coach)
// -> Team(
// name: "Indiana Pacers",
// coach: Coach(name: "Isiah Thomas", FormerPlayer = True),
// stats: Stats(wins: 58, losses: 24),
// )
Mientras revisas las estadísticas, llevas listas de equipos y sus registros. A veces te equivocas y hay entradas duplicadas en tu lista. Implementa la función is_same_team, que recibe dos equipos y devuelve True si son el mismo equipo; de lo contrario, devuelve False:
let pacers_coach = create_coach("Larry Bird", True)
let pacers_stats = create_stats(58, 24)
let pacers_team = create_team("Indiana Pacers", pacers_coach, pacers_stats)
let lakers_coach = create_coach("Del Harris", False)
let lakers_stats = create_stats(61, 21)
let lakers_team = create_team("LA Lakers", lakers_coach, lakers_stats)
is_same_team(pacers_team, lakers_team)
// -> False
Después de analizar muchos equipos y partidos, se te ocurrió un algoritmo. Si se cumple una de las siguientes condiciones, apoyas a ese equipo:
Implementa la función root_for_team, que recibe un equipo y devuelve True si deberías apoyar a ese equipo; de lo contrario, devuelve False:
let spurs_coach = create_coach("Gregg Popovich", False)
let spurs_stats = create_stats(56, 26)
let spurs_team = create_team("San Antonio Spurs", spurs_coach, spurs_stats)
root_for_team(spurs_team)
// -> True
Regístrate en Exercism para aprender y dominar Gleam con 33 conceptos122 ejercicios y mentoría humana real, todo gratis.