Elixir-typespecs

提供:Dev Guides
移動先:案内検索

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 ディレクティブを使用できます。