Учебники

Эликсир — Typespecs

Elixir — это динамически типизированный язык, поэтому все типы в Elixir выводятся во время выполнения. Тем не менее, Elixir поставляется с типами спецификаций, которые используются для объявления пользовательских типов данных и сигнатур типизированных функций (спецификаций) .

Функциональные характеристики (спецификации)

По умолчанию Elixir предоставляет несколько основных типов, таких как целое число или pid, а также сложные типы: например, функция округления , которая округляет число с плавающей точкой до ближайшего целого числа, принимает число в качестве аргумента (целое число или число с плавающей запятой) и возвращает целое число В соответствующей документации круглая печатная подпись записывается как —

round(number) :: integer

Вышеприведенное описание подразумевает, что функция слева принимает в качестве аргумента то, что указано в скобках, и возвращает то, что справа от ::, то есть Integer. Спецификации функций записываются с помощью директивы @spec , расположенной прямо перед определением функции. Функция округления может быть записана как —

@spec round(number) :: integer
def round(number), do: # Function implementation
...

Типы также поддерживают сложные типы, например, если вы хотите вернуть список целых чисел, вы можете использовать [Integer]

Пользовательские типы

В то время как Elixir предоставляет много полезных встроенных типов, удобно определять пользовательские типы при необходимости. Это можно сделать при определении модулей с помощью директивы @type. Давайте рассмотрим пример, чтобы понять то же самое —

Live Demo

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 .