Pozornie jest to proste, ale nie mogę znaleźć tego w dokumentacji. Muszę po prostu zwrócić true
lub false
jeśli element istnieje na liście lub w krotce. Czy Enum.find/3
naprawdę jest to najlepszy sposób?
Enum.find(["foo", "bar"], &(&1 == "foo")) != nil
x in y
Strażnik jest bardzo wydajnych, ponieważ tworzy różne definicje funkcji w czasie kompilacji. W czasie wykonywania jest mniej wydajny, równoważnyEnum.member?
, chociaż można ich używać w przypadku małych n . Dla dużych n i ciasne pętle, dostaniesz lepszą wydajność od czegoś, mieszań, takie jakMapSet.member?
. Ale w większości przypadkówx in y
iEnum.member?
są w porządku!Odpowiedzi:
Możesz użyć
Enum.member?/2
W przypadku krotki będziesz chciał najpierw przekonwertować na listę za pomocą
Tuple.to_list/1
źródło
Enum.member?/2
wewnątrz strażnika. W takim przypadku będziesz musiał polegaćin
. Na przykład:def foo(string) when string in ["one", "two"], do: IO.puts(string)
. Nawiasem mówiąc, jest to zabawne, ponieważin
jest to makro, które można przetłumaczyć naEnum.member?/2
: DW oparciu o odpowiedzi tutaj oraz w Elixir Slack, istnieje wiele sposobów sprawdzenia, czy pozycja znajduje się na liście. Za odpowiedź od @Gazler:
lub po prostu
lub
lub jeśli chcesz znaleźć i zwrócić przedmiot zamiast
true
lubfalse
Jeśli chcesz sprawdzić krotkę, musisz przekonwertować na listę (kredyt @Gazler):
Ale jak @CaptChrisD zauważył w komentarzach, jest to rzadka potrzeba tworzenia krotki, ponieważ zwykle zależy nam na dokładnym położeniu elementu w krotce w celu dopasowania wzorca.
źródło
Lub po prostu użyj
in
:źródło
Wczoraj zacząłem programować w Elixirze, ale spróbuję czegoś, co robiłem dużo w JS, może jest to przydatne, gdy lista ma dużo elementów i nie chcesz jej cały czas przemierzać za pomocą Enum.member?
Możesz również pobrać skrzyżowanie z inną listą:
źródło
Możesz
Enum.find_value/3
też użyć :źródło