Elixir-structs

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

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"}

構造体は、特定のキーの値の一致と、一致する値が一致した値と同じ型の構造体であることを確認するために、パターンマッチングでも使用できます。