Data abstractionsに書かれている章でした。
ここが終わったので、いよいよElixir/Erlangの真骨頂であるHigh Availabilityなシステムを構築するための説明に入ります。
structure
moduleは、抽象データを作るために使われる。
- map
%{neko: 1, inu: 2}
- structs
defmodule Sample do
defstruct neko: 1, inu: 2
end
%Sample{neko: 1, inu: 2}
mapとstructsは同じように使われることが多い。
ただ、違うところもある。
例えばパターンマッチ
iex> %Sample{} = %{neko: 1, inu: 2}
** (MatchError) no match ...
iex> %{neko: a, inu: b} = %Sample{neko: 1, inu: 2}
iex> a
1
iex> b
2
このように、structはmapの特殊な形として使われる。
ちなみに、Recordというモジュールもあって、これは主にErlangライブラリを使う時には、Recordをimportして使いましょう、というものらしい。
polymorphism
Elixirでは、polymorphismは protocol によって実現される。
defprotocol ではインターフェースを定義して、 defimpl でその実装を加えていく。
例えば、 to_string を独自のmodule、 Sample に加えるなら、
defimpl String.Chars, for: Sample do def to_string(_) do "#Sample" end end
とすると、その結果として
iex> IO.puts(Sample.new) #Sample
と得られる。(IO.putsはString.Chars.to_stringを指している)
このprotocolは、他にも Inspect や Access といったものもある。
Elixirでは、このように元となる protocol に対して defimpl 内の実装を増やすことで機能を拡張していく。
1 Comment