2016-09-27 12 views
3

私はマップに対してパターンマッチングを行い、関数で使用するために関数句を書くのに問題があります。私は構文が何であるか理解できません。私は、これは非常に基本的であると確信しているが、それは私に逃亡しているように見える何か関数の引数としてのパターンマッチングマップ

def check_data (arg1, %{"action" => "action1", ...}, arg2) do 
    # access other keys of the structure 
end 

:基本的に私はこのような何かをしたいです。私は多くのチュートリアルを終えましたが、このユースケースを扱うチュートリアルを見つけることができないようです。

+1

あなたは 'DEF check_data(%{ "アクション" => "アクション1"} = ARG1、ARG2)のように平均します'または' def check_data(arg1、%{"action" => "acti on1 "} = arg2)'? – Dogbert

+0

@Dogbertいいえ、いいえ。私が示したことは、マップの他にも他の議論があることでした。関数のパラメータの中で 'arg1 =%{}'を実行できますか? :O – dotslash

+2

だから 'def check_data(arg1、%{"アクション "=>"アクション1 "} =マップ、arg2)'?はい、関数のパラメータで '='を使うことができます。 – Dogbert

答えて

8

マップの一部のキーが一致しても変数にマップ全体を格納するには、パターンで= variableを使用することができます。

def check_data(arg1, %{"action" => "action1"} = map, arg2) do 
end 

この関数は、(キー"action""action1"を含む任意のマップと一致しますそして第2の引数として他の任意のキー/値のペア)、及びmapにマップ全体を保存:

iex(1)> defmodule Main do 
...(1)> def check_data(_arg1, %{"action" => "action1"} = map, _arg2), do: map 
...(1)> end 
iex(2)> Main.check_data :foo, %{}, :bar 
** (FunctionClauseError) no function clause matching in Main.check_data/3 
    iex:2: Main.check_data(:foo, %{}, :bar) 
iex(2)> Main.check_data :foo, %{"action" => "action1"}, :bar 
%{"action" => "action1"} 
iex(3)> Main.check_data :foo, %{"action" => "action1", :foo => :bar}, :bar 
%{:foo => :bar, "action" => "action1"} 
関連する問題