Elixir — это динамически типизированный язык, поэтому все типы в Elixir выводятся во время выполнения. Тем не менее, Elixir поставляется с типами спецификаций, которые используются для объявления пользовательских типов данных и сигнатур типизированных функций (спецификаций) .
Функциональные характеристики (спецификации)
По умолчанию Elixir предоставляет несколько основных типов, таких как целое число или pid, а также сложные типы: например, функция округления , которая округляет число с плавающей точкой до ближайшего целого числа, принимает число в качестве аргумента (целое число или число с плавающей запятой) и возвращает целое число В соответствующей документации круглая печатная подпись записывается как —
round(number) :: integer
Вышеприведенное описание подразумевает, что функция слева принимает в качестве аргумента то, что указано в скобках, и возвращает то, что справа от ::, то есть Integer. Спецификации функций записываются с помощью директивы @spec , расположенной прямо перед определением функции. Функция округления может быть записана как —
@spec round(number) :: integer def round(number), do: # Function implementation ...
Типы также поддерживают сложные типы, например, если вы хотите вернуть список целых чисел, вы можете использовать [Integer]
Пользовательские типы
В то время как Elixir предоставляет много полезных встроенных типов, удобно определять пользовательские типы при необходимости. Это можно сделать при определении модулей с помощью директивы @type. Давайте рассмотрим пример, чтобы понять то же самое —
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)
Когда вышеуказанная программа запущена, она дает следующий результат —
30 You need a calculator to do that?
ПРИМЕЧАНИЕ. — Пользовательские типы, определенные с помощью @type, экспортируются и доступны вне модуля, в котором они определены. Если вы хотите сохранить пользовательский тип закрытым, вы можете использовать директиву @typep вместо @type .