Elixir-typespecs
Elixir-タイプスペック
Elixirは動的に型指定された言語であるため、Elixirのすべての型はランタイムによって推測されます。 それにもかかわらず、Elixirにはtypespecが付属しています。これは、*カスタムデータ型の宣言と型付き関数のシグネチャ(仕様)*の宣言に使用される表記法です。
機能仕様(仕様)
デフォルトでは、Elixirは整数やpidなどのいくつかの基本型、および複雑な型も提供します。たとえば、 round 関数は、floatを最も近い整数に丸め、数値を引数(整数またはfloat )整数を返します。 関連するhttps://elixir-lang.org/docs/stable/elixir/Kernell#round/1[documentation]では、丸められた署名は次のように書かれています-
round(number) :: integer
上記の説明は、左側の関数が括弧で指定されたものを引数として受け取り、::の右側にあるもの、つまり整数を返すことを意味します。 関数仕様は、関数定義の直前に置かれた @ spec ディレクティブで記述されます。 ラウンド関数は次のように書くことができます-
@spec round(number) :: integer
def round(number), do: # Function implementation
...
Typespecは複雑な型もサポートしています。たとえば、整数のリストを返す場合は、 [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を介して定義されたカスタムタイプはエクスポートされ、定義されているモジュールの外部で利用可能です。 カスタムタイプをプライベートに保ちたい場合は、 @ type の代わりに @ typep ディレクティブを使用できます。