Это вроде бы просто, но я не могу найти его в документации. Мне нужно просто вернуть true
или, false
если элемент существует в списке или кортеже. Действительно Enum.find/3
ли лучший способ сделать это?
Enum.find(["foo", "bar"], &(&1 == "foo")) != nil
x in y
Охранник очень производительный , потому что он создает различные определения функций во время компиляции. Во время выполнения он менее эффективен, эквивалентенEnum.member?
, хотя их можно использовать для малых n . Для больших n и плотных циклов вы получите лучшую производительность от чего-то, что имеет хеширование, напримерMapSet.member?
. Но в большинстве случаевx in y
иEnum.member?
все нормально!Ответы:
Вы можете использовать
Enum.member?/2
С кортежем вы захотите сначала преобразовать его в список, используя
Tuple.to_list/1
источник
Enum.member?/2
внутри охранника. В этом случае придется положиться наin
. Например:def foo(string) when string in ["one", "two"], do: IO.puts(string)
. Между прочим, это забавно, потому чтоin
это макрос, который переводится какEnum.member?/2
: DОсновываясь на ответах здесь и в Elixir Slack, есть несколько способов проверить, существует ли элемент в списке. Согласно ответу @Gazler:
или просто
или же
или если вы хотите найти и вернуть товар вместо
true
илиfalse
Если вы хотите проверить кортеж, вам нужно преобразовать его в список (кредит @Gazler):
Но, как отметил @CaptChrisD в комментариях, это необычная потребность в кортеже, потому что обычно для сопоставления с образцом заботится о точном положении элемента в кортеже.
источник
Или просто используйте
in
:источник
Вчера я начал программировать на Elixir, но я попробую то, что много делал на JS. Может быть, это полезно, когда в списке много элементов, и вы не хотите постоянно перемещаться по нему с помощью Enum.member?
Вы также можете получить пересечение с другим списком:
источник
Вы также можете использовать
Enum.find_value/3
:источник