Regex 正则表达式和映射参数匹配

Regex 正则表达式和映射参数匹配,regex,dictionary,elixir,enumerable,Regex,Dictionary,Elixir,Enumerable,在编写函数时,我使用参数匹配,如下所示: def process_thing( %{} = thing ) 我希望它是一张地图,并且是可枚举的。不幸的是,此参数列表也与指定为~r/regex/的正则表达式相匹配,尽管它为is_map~r/thing/返回true,但该正则表达式不可枚举 我怎样才能精心设计这个函数定义,以便只将映射(或者理想情况下是可枚举的东西)分派到此函数?无法匹配可枚举的东西。如果您只需要地图就可以了,那么您就有了内置的功能: def process_thing(thing

在编写函数时,我使用参数匹配,如下所示:

def process_thing( %{} = thing )
我希望它是一张地图,并且是可枚举的。不幸的是,此参数列表也与指定为~r/regex/的正则表达式相匹配,尽管它为is_map~r/thing/返回true,但该正则表达式不可枚举

我怎样才能精心设计这个函数定义,以便只将映射(或者理想情况下是可枚举的东西)分派到此函数?

无法匹配可枚举的东西。如果您只需要地图就可以了,那么您就有了内置的功能:

def process_thing(thing) when is_map(thing) do
   ...
end
另一种方法是检查您期望和支持的所有数据类型:

def process_thing(thing) when is_map(thing) or is_list(thing), do: ...
def process_thing(%MapSet{}), do: ...
...
如果您需要支持所有可枚举项,那么提供关于您的用例的更多信息的好建议可能会更容易,您可以始终使用:

并处理Protocol.assert_impl可能出现的故障/2.我不确定这个实现是否是防弹的,而且可能有更干净的方法来实现它:

还有一件事:如果您想在映射上匹配,但在Regex等结构上不匹配,解决方法之一是首先匹配您不想匹配的内容,这样您就可以避开它们,并按需要处理它们:

def process_thing(%{__struct__: _}), do: # bad things here, we don't like structs
def process_thing(%{} = thing), do: # hey, that's a map now!
无法匹配可枚举的对象。如果您只需要地图就可以了,那么您就有了内置的功能:

def process_thing(thing) when is_map(thing) do
   ...
end
另一种方法是检查您期望和支持的所有数据类型:

def process_thing(thing) when is_map(thing) or is_list(thing), do: ...
def process_thing(%MapSet{}), do: ...
...
如果您需要支持所有可枚举项,那么提供关于您的用例的更多信息的好建议可能会更容易,您可以始终使用:

并处理Protocol.assert_impl可能出现的故障/2.我不确定这个实现是否是防弹的,而且可能有更干净的方法来实现它:

还有一件事:如果您想在映射上匹配,但在Regex等结构上不匹配,解决方法之一是首先匹配您不想匹配的内容,这样您就可以避开它们,并按需要处理它们:

def process_thing(%{__struct__: _}), do: # bad things here, we don't like structs
def process_thing(%{} = thing), do: # hey, that's a map now!