Goal
関数の引数でマップを使う時、パターンマッチを利用する。
Dev-Environment
OS: Windows8.1
Erlang: Eshell V6.4, OTP-Version 17.5
Elixir: v1.0.5
Erlang: Eshell V6.4, OTP-Version 17.5
Elixir: v1.0.5
Wait a minute
関数の引数でマップを使った時のパターンマッチの応用。
ただのTipsです。
ただのTipsです。
Index
Application of pattern matching
|> Example code
|> Let’s run!
|> 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
これで何ができるのか?っと言ったところですが、
これは、マップ内で特定のキーを持ったマップの引数にのみ合致してくれます。
これは、マップ内で特定のキーを持ったマップの引数にのみ合致してくれます。
そして、そのキーの値を抽出してくれます。
なおかつ、マップそのものも引数として取得しています。
(一挙両独?もしくは一石二鳥?)
なおかつ、マップそのものも引数として取得しています。
(一挙両独?もしくは一石二鳥?)
単体だとあまり、効果が感じられないと思いますが、
組み合わせていくことによって引数の制限を二つの意味で掛けることができますね。
組み合わせていくことによって引数の制限を二つの意味で掛けることができますね。