Elixir-유형 사양

Elixir는 동적으로 입력되는 언어이므로 Elixir의 모든 유형은 런타임에서 유추됩니다. 그럼에도 불구하고 Elixir는 typespecs와 함께 제공됩니다.declaring custom data types and declaring typed function signatures (specifications).

기능 사양 (사양)

기본적으로 Elixir는 정수 또는 pid와 같은 몇 가지 기본 유형과 복합 유형도 제공합니다. roundfloat를 가장 가까운 정수로 반올림하는 함수는 숫자를 인수 (정수 또는 부동 소수점)로 취하고 정수를 반환합니다. 관련 문서 에서 원형 형식의 서명은 다음과 같이 작성됩니다.

round(number) :: integer

위의 설명은 왼쪽에있는 함수가 괄호 안에 지정된 것을 인수로 취하고 ::의 오른쪽에있는 것을 반환한다는 것을 의미합니다. 즉, Integer입니다. 기능 사양은@spec지시어, 함수 정의 바로 앞에 배치됩니다. round 함수는 다음과 같이 작성할 수 있습니다.

@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?

NOTE − @type을 통해 정의 된 사용자 정의 유형은 내보내고 정의 된 모듈 외부에서 사용할 수 있습니다. 사용자 정의 유형을 비공개로 유지하려면 다음을 사용할 수 있습니다. @typep 대신 지시문 @type.