给定一个 MapSet,如何使用模式匹配检测它是否为空?

# What goes in the question marks?
def my_func(????), do: IO.puts("This mapset is empty")
def my_func(%MapSet{}), do: IO.puts("This mapset is not empty")

my_func(MapSet.new())

如果这是一个列表,我会在 ([]) 上匹配它,但这不适用于 MapSets(因为类型不同)

这是我尝试过的其他一些事情,但没有成功。
def myfunc([]), do: IO.puts("This only works for lists")
# This is a syntax error
# def myfunc(MapSize.new())

def myfunc(%MapSet{}), do: IO.puts("This matches every mapset")
def myfunc(a) when map_size(a), do: IO.puts("the map size is always 3")

最佳答案

你也可以考虑 the solution I provided for matching against an empty map 如下:

defmodule A do
  def empty?(some_map_set = %MapSet{}) do
    an_empty_map_set = MapSet.new

    some_map_set
    |> case do
    ^an_empty_map_set ->true  # Application of pin operator
    _ -> false
    end
  end
end

您可以进行如下测试:
A.empty?(MapSet.new)

A.empty?(MapSet.new([1]))
在该链接中,您可以看到可以相应利用的其他解决方案。
@dogbert 已经提供了一个。
另一种解决方案的工作方式如下:
defmodule A do
  @empty MapSet.new
  def empty?(some_map_set) when some_map_set == @empty, do: true
  def empty?(%MapSet{}), do: false
end

关于elixir - 模式匹配空 MapSet,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/49284613/

10-09 13:06