Pattern match function against empty map

后端 未结 3 1191
执笔经年
执笔经年 2020-12-16 08:49

I\'m playing around with pattern match and I found out, that it\'s not quite easy to pattern match parameters of a method against an empty map. I thought it would go somethi

3条回答
  •  小蘑菇
    小蘑菇 (楼主)
    2020-12-16 09:45

    In addition to @PatrickOscity's answer (which I would use for an empty map), you can use a map_size/1 guard to match against maps with a number of keys:

    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
    

    Here is an output from iex using Kernel.match?/2 to show map_size/1 in action:

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

提交回复
热议问题