LoginSignup
4
4

More than 5 years have passed since last update.

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

Last updated at Posted at 2015-09-10

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

github - Ecto - ecto/lib/ecto/model/callbacks.ex

4
4
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
4
4