スポンサーリンク

2015年9月10日

[Elixir]マップを引数で使う時のパターンマッチの応用

とある錬金術師の万能薬(Elixir)

Goal

関数の引数でマップを使う時、パターンマッチを利用する。

Dev-Environment

OS: Windows8.1
Erlang: Eshell V6.4, OTP-Version 17.5
Elixir: v1.0.5

Wait a minute

関数の引数でマップを使った時のパターンマッチの応用。
ただのTipsです。

Index

Application of pattern matching
|> Example code
|> Let’s run!

Example code

サンプルのソースコードを作成します。

Example:

defmodule PatternMatchSample do
  def test(%{__struct__: s} = data) do
    IO.inspect s
    IO.inspect data
  end
end

Let’s run!

iexから実行してみましょう。

Result:

iex> import PatternMatchSample
nil
まずは、普通にマップを作成して渡す。
iex> hoge = %{hoge: "hoge"}
%{hoge: "hoge"}
iex> test(hoge)
** (FunctionClauseError) no function clause matching in PatternMatchSample.test/1
    iex:4: PatternMatchSample.test(%{hoge: "hoge"})
関数にマッチしないと怒られてますね。
次、引数の形に合わせてマップを作って渡す。
iex> hoge = %{__struct__: "hoge"}
%{__struct__: "hoge"}
iex> test(hoge)
"hoge"
%{__struct__: "hoge"}
%{__struct__: "hoge"}
動作しますね。
蛇足ですが、マップの内容が複数であった場合。
iex> hoge = %{__struct__: "hoge", huge: "huge"}
%{__struct__: "hoge", huge: "huge"}
iex> test(hoge)
"hoge"
%{__struct__: "hoge", huge: "huge"}
%{__struct__: "hoge", huge: "huge"}

Speaking to oneself

これで何ができるのか?っと言ったところですが、
これは、マップ内で特定のキーを持ったマップの引数にのみ合致してくれます。
そして、そのキーの値を抽出してくれます。
なおかつ、マップそのものも引数として取得しています。
(一挙両独?もしくは一石二鳥?)
単体だとあまり、効果が感じられないと思いますが、
組み合わせていくことによって引数の制限を二つの意味で掛けることができますね。

Bibliography

人気の投稿