Il n'y a aucun moyen pour de faire correspondre sur quelque chose comme Enumerable
. Si vous êtes ok avec seulement des cartes, vous avez la is_map/1
fonction intégrée:
def process_thing(thing) when is_map(thing) do
...
end
Une alternative est la vérification de tous les types de données que vous attendez et le soutien:
def process_thing(thing) when is_map(thing) or is_list(thing), do: ...
def process_thing(%MapSet{}), do: ...
...
Si vous nécessité de soutenir tous enumerables (peut-être il sera plus facile de donner de bons conseils avec plus d'informations sur votre cas d'utilisation), vous pouvez toujours utiliser Protocol.assert_impl!/2
:
def process_thing(thing) when is_map(thing) or is_list(thing), do: ...
def process_thing(%{__struct__: struct}) do
assert_impl!(Enumerable, struct)
end
et gérer l'échec possible de Protocol.assert_impl!/2
. Je ne suis pas sûr si cette implémentation est pare-balles et encore une fois, il peut y avoir une façon plus simple de mettre en œuvre cela. :)
Encore une chose: si vous voulez faire correspondre sur les cartes, mais ne correspondent pas à struct (comme Regex
), une façon de le résoudre est le premier match sur les choses que vous ne voulez correspondre pour que vous les mettez à l'écart (et les manipulez comme vous le souhaitez):
def process_thing(%{__struct__: _}), do: # bad things here, we don't like structs
def process_thing(%{} = thing), do: # hey, that's a map now!