Encadenamientos con with en Elixir
Una lista de despegue: with recorre el camino feliz de tuplas ok y else atrapa el primer fallo.
defmodule Launch do
defp fuel(:full), do: {:ok, 100}
defp fuel(_tank), do: {:error, :fuel_low}
defp weather("clear"), do: {:ok, "clear"}
defp weather(sky), do: {:error, {:sky, sky}}
# with chains steps that must all match; else handles any miss.
def go?(tank, sky) do
with {:ok, pct} <- fuel(tank),
{:ok, _} <- weather(sky) do
"launch with #{pct}% fuel"
else
{:error, why} -> "scrubbed: #{inspect(why)}"
end
end
end
IO.puts(Launch.go?(:full, "clear"))
IO.puts(Launch.go?(:full, "storm"))
Cómo funciona
fuelyweatherdevuelven cada una{:ok, ...}o{:error, ...}.withhace coincidir cada paso<-en orden; pasarlos todos llega al bloque do.- La primera coincidencia fallida cae en
else, que reporta por qué se canceló el despegue.
Palabras clave y builtins usados aquí
_defdefmoduledefpdoelseend
El intento, en números
- Líneas
- 20
- Caracteres a escribir
- 490
- Tokens
- 151
- Ritmo de tres estrellas
- 70 tpm
Al ritmo de tres estrellas de 70 tokens por minuto, este intento toma unos 129 segundos.
Paso 2 de 3 en Control de flujo; paso 20 de 27 en Fundamentos del lenguaje.