2015-10-21 4 views
28

私はパターンマッチで遊んでいますが、空のマップに対してメソッドのパラメータをパターン化するのは簡単ではないことがわかりました。私はそれがこのような何かを行くだろうと思った:空のマップに対するパターンマッチ関数

defmodule PatternMatch do 
    def modify(%{}) do 
    %{} 
    end 

    def modify(map) do 
    # expensive operation 
    %{ modified: "map" } 
    end 
end 

しかし、最初の関数の句は任意のマップと一致するように思える:

iex> PatternMatch.modify(%{a: "map"}) 
==> %{} 

空のマップをチェックする別の方法はありますか?

+0

関数句の順序もこの問題に影響しますか?私は空のマップは常に一致するので、最後の関数節にする必要がありますか? –

答えて

49

このように設計されていますが、一見すると少し混乱する可能性があります。この機能を使用すると、すべてのキーを指定することなく、パターンマッチングを使用してマップを分解することができます。たとえば、

iex> %{b: value} = %{a: 1, b: 2, c: 3} 
%{a: 1, b: 2, c: 3} 

iex> value 
2 

したがって、%{}はどのマップにも一致します。

は(私は空のマップのために使用します)@ PatrickOscityの答えに加えて
defmodule PatternMatch do 
    def modify(map) when map == %{} do 
    %{} 
    end 

    def modify(map) do 
    # ... 
    end 
end 
17

、あなたがmap_size/1ガードを使用することができます:あなたが関数内で空のマップを一致させたい場合は、ガード句を使用する必要がありますキーの数とマップマッチングを行うために:

iex(6)> Kernel.match?(map when map_size(map) == 1, %{}) 
false 
iex(7)> Kernel.match?(map when map_size(map) == 1, %{foo: "bar"}) 
true 
+4

ニース。小さな訂正:私は 'map_size ...の代わりに' map_size(map)... 'でなければならないと思う。 –

+0

よく目がまえた!ありがとう。 – Gazler

0

:ここ

defmodule PatternMatch do 
    def modify(map) when map_size(map) == 0 do 
    %{} 
    end 

    def modify(map) when map_size(map) == 1 do 
    #something else 
    end 

    def modify(map) do 
    # expensive operation 
    %{ modified: "map" } 
    end 
end 

することはアクションでmap_size/1を表示するKernel.match?/2を使用してIEXから出力され、これまでに提供されたすべてのクールな回答に加えて、unary pin operatorの使い方を帽子や上向きの矢印のように考えてもよいでしょう。あなたではなく 既存の変数の値に対してパターンマッチさせたいとき

はピン演算子^を使用します。関連文書に記載されているようにあなたは、その値に対してあなたのパターンマッチを確保することで、変数の前に付けるためにそれを使用します

次のように確認することができます
defmodule A do 
    def determine_map_volume(some_map) do 
    an_empty_map = %{} 

    some_map 
    |> case do 
    ^an_empty_map -> :empty # Application of pin operator 
    _ -> :not_empty 
    end 
    end 
end 

例である次の変数

を再バインド

A.determine_map_volume(%{}) 
:empty 
A.determine_map_volume(%{a: 1}) 
:not_empty 

どの方法を使用するかは、コードの可読性のための個人的/組織的な好みによって異なります。

関連する問題