En Elixir, una tupla es una estructura de datos que organiza información y que contiene un número fijo de elementos de cualquier tipo, pero sin nombres explícitos para cada elemento. Las tuplas se usan a menudo en Elixir para operaciones que hacen un uso intensivo de la lectura de memoria, ya que el acceso de lectura a un elemento es una operación de tiempo constante. No suelen usarse cuando puede ser necesario añadir o eliminar elementos de forma dinámica, porque en lugar de modificar la tupla existente se crea una nueva, lo que requiere reservar memoria de antemano.
En la práctica, las tuplas se crean en Elixir con llaves. Se puede acceder a cada elemento de una tupla por separado con la función elem/2 mediante indexación basada en 0:
empty_tuple = {}
one_element_tuple = {1}
multiple_element_tuple = {1, :a, "hello"}
elem(multiple_element_tuple, 2)
# => "hello"
En la práctica, las tuplas se usan a menudo para representar información agrupada.
Float.ratio(0.25)
# => {1, 4} indicating the numerator and denominator of the fraction ¼
El uso de la coincidencia de patrones es dominante en el código Elixir idiomático y asertivo. Quizá recuerdes que =/2 se describe como un operador de coincidencia y no como un operador de asignación. Cuando usas el operador de coincidencia, si el patrón de la izquierda coincide con el de la derecha, se vinculan las variables de la izquierda y se devuelve el valor del lado derecho. Si no hay coincidencia, se lanza un MatchError.
2 = 2
# => 2
# Literals can be matched if they are the same
2 = 3
# => ** (MatchError) no match of right hand side value: 3
{_, denominator} = Float.ratio(0.25)
# => {1, 4}
# the variable `denominator` is bound to the value 4
Recuerda que las coincidencias se producen de derecha a izquierda.
En el último ejemplo, si no necesitamos una variable en una coincidencia de patrones, podemos descartarla haciendo referencia a _. El runtime no hace un seguimiento de ninguna variable que empiece por _.
La coincidencia de patrones también es una herramienta útil cuando se crean varias cláusulas de función. La coincidencia de patrones puede aplicarse a los argumentos de la función, lo que determina qué cláusula de función se invoca, empezando por la parte superior del archivo y bajando hasta la primera coincidencia. Las variables pueden vincularse en la cabecera de la función y usarse en el cuerpo de la función.
defmodule Example do
def named_function(:a = variable_a) do
{variable_a, 1}
end
def named_function(:b = variable_b) do
{variable_b, 2}
end
end
Example.named_function(:a)
# => {:a, 1}
Example.named_function(:b)
# => {:b, 2}
Example.named_function(:c)
# => ** (FunctionClauseError) no function clause matching in Example.named_function/1
Mientras te preparabas para hornear galletas para tus amigos, te has dado cuenta de que tienes que convertir algunas de las medidas que se usan en la receta. Como solo conoces el sistema métrico, necesitas idear una forma de convertir las medidas de repostería estadounidenses habituales a mililitros (mL) para tu propia comodidad.
Usa esta tabla de conversión para tu solución:
| Unidad a convertir | volumen | en mililitros (mL) |
|---|---|---|
| mL | 1 | 1 |
| Taza estadounidense | 1 | 240 |
| Onza líquida estadounidense | 1 | 30 |
| Cucharadita estadounidense | 1 | 5 |
| Cucharada estadounidense | 1 | 15 |
Como eres un programador con talento en formación, decides usar los mililitros como unidad intermedia para facilitar la conversión de cualquier unidad de la lista a cualquier otra (incluso a sí misma).
Implementa la función KitchenCalculator.get_volume/1. Dada una tupla de par de volumen, debe devolver solo el componente numérico.
KitchenCalculator.get_volume({:cup, 2.0})
# => 2.0
Implementa la función KitchenCalculator.to_milliliter/1. Dada una tupla de par de volumen, debe convertir el volumen a mililitros usando la tabla de conversión.
Usa varias cláusulas de función y la coincidencia de patrones para crear las funciones de cada unidad. Los átomos que se usan para denotar cada unidad son: :cup, :fluid_ounce, :teaspoon, :tablespoon, :milliliter. Devuelve el resultado de la conversión envuelto en una tupla.
KitchenCalculator.to_milliliter({:cup, 2.5})
# => {:milliliter, 600.0}
Implementa la función KitchenCalculator.from_milliliter/2. Dada una tupla de par de volumen y la unidad deseada, debe convertir el volumen a la unidad deseada usando la tabla de conversión.
Usa varias cláusulas de función y la coincidencia de patrones para crear las funciones de cada unidad. Los átomos que se usan para denotar cada unidad son: :cup, :fluid_ounce, :teaspoon, :tablespoon, :milliliter
KitchenCalculator.from_milliliter({:milliliter, 1320.0}, :cup)
# => {:cup, 5.5}
Implementa la función KitchenCalculator.convert/2. Dada una tupla de par de volumen y la unidad deseada, debe convertir el volumen dado a la unidad deseada.
KitchenCalculator.convert({:teaspoon, 9.0}, :tablespoon)
# => {:tablespoon, 3.0}
Regístrate en Exercism para aprender y dominar Elixir con 58 conceptos168 ejercicios y mentoría humana real, todo gratis.