[Elixir in Action]polymorphismで拡張していく

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は、他にも InspectAccess といったものもある。
Elixirでは、このように元となる protocol に対して defimpl 内の実装を増やすことで機能を拡張していく。

[Elixir in Action]polymorphismで拡張していく」への1件のフィードバック

コメントを残す

以下に詳細を記入するか、アイコンをクリックしてログインしてください。

WordPress.com ロゴ

WordPress.com アカウントを使ってコメントしています。 ログアウト / 変更 )

Twitter 画像

Twitter アカウントを使ってコメントしています。 ログアウト / 変更 )

Facebook の写真

Facebook アカウントを使ってコメントしています。 ログアウト / 変更 )

Google+ フォト

Google+ アカウントを使ってコメントしています。 ログアウト / 変更 )

%s と連携中