Elixir-構造体

構造体は、コンパイル時のチェックとデフォルト値を提供するマップ上に構築された拡張機能です。

構造体の定義

構造体を定義するには、defstruct構造体を使用します-

defmodule User do
   defstruct name: "John", age: 27
end

defstructで使用されるキーワードリストは、構造体が持つフィールドとそのデフォルト値を定義します。構造体は、それらが定義されているモジュールの名前を取ります。上記の例では、Userという名前の構造体を定義しました。マップの作成に使用したものと同様の構文を使用して、ユーザー構造体を作成できるようになりました-

new_john = %User{})
ayush = %User{name: "Ayush", age: 20}
megan = %User{name: "Megan"})

上記のコードは、値が-の3つの異なる構造体を生成します。

%User{age: 27, name: "John"}
%User{age: 20, name: "Ayush"}
%User{age: 27, name: "Megan"}

構造体は、defstructを介して定義されたフィールド(およびそれらすべて)のみが構造体に存在できることをコンパイル時に保証します。したがって、モジュールで構造体を作成した後は、独自のフィールドを定義することはできません。

構造体へのアクセスと更新

マップについて説明するときに、マップのフィールドにアクセスして更新する方法を示しました。同じ手法(および同じ構文)が構造体にも適用されます。たとえば、前の例で作成したユーザーを更新する場合は、-

defmodule User do
   defstruct name: "John", age: 27
end
john = %User{}
#john right now is: %User{age: 27, name: "John"}

#To access name and age of John, 
IO.puts(john.name)
IO.puts(john.age)

上記のプログラムを実行すると、次の結果が生成されます-

John
27

構造体の値を更新するには、マップの章で使用したのと同じ手順を再度使用します。

meg = %{john | name: "Meg"}

構造体は、特定のキーの値を照合するため、および照合値が照合された値と同じタイプの構造体であることを確認するために、パターンマッチングで使用することもできます。