Elixir - Typepecs
Elixir es un lenguaje escrito dinámicamente, por lo que todos los tipos en Elixir son inferidos por el tiempo de ejecución. No obstante, Elixir viene con typepecs, que es una notación utilizada paradeclaring custom data types and declaring typed function signatures (specifications).
Especificaciones de función (especificaciones)
Por defecto, Elixir proporciona algunos tipos básicos, como integer o pid, y también tipos complejos: por ejemplo, el roundfunción, que redondea un flotante a su número entero más cercano, toma un número como argumento (un número entero o un flotante) y devuelve un número entero. En la documentación relacionada , la firma mecanografiada redonda se escribe como:
round(number) :: integer
La descripción anterior implica que la función de la izquierda toma como argumento lo que se especifica entre paréntesis y devuelve lo que está a la derecha de ::, es decir, Integer. Las especificaciones de la función se escriben con@specdirectiva, colocada justo antes de la definición de función. La función redonda se puede escribir como -
@spec round(number) :: integer
def round(number), do: # Function implementation
...
Typepecs también admite tipos complejos, por ejemplo, si desea devolver una lista de números enteros, puede usar [Integer]
Tipos personalizados
Si bien Elixir proporciona muchos tipos incorporados útiles, es conveniente definir tipos personalizados cuando sea apropiado. Esto se puede hacer al definir módulos a través de la directiva @type. Consideremos un ejemplo para entender lo mismo:
defmodule FunnyCalculator do
@type number_with_joke :: {number, String.t}
@spec add(number, number) :: number_with_joke
def add(x, y), do: {x + y, "You need a calculator to do that?"}
@spec multiply(number, number) :: number_with_joke
def multiply(x, y), do: {x * y, "It is like addition on steroids."}
end
{result, comment} = FunnyCalculator.add(10, 20)
IO.puts(result)
IO.puts(comment)
Cuando se ejecuta el programa anterior, produce el siguiente resultado:
30
You need a calculator to do that?
NOTE - Los tipos personalizados definidos a través de @type se exportan y están disponibles fuera del módulo en el que están definidos. Si desea mantener un tipo personalizado en privado, puede utilizar el @typep directiva en lugar de @type.