Dies ist scheinbar einfach, aber ich kann es nicht in den Dokumenten finden. Ich muss einfach zurückkehren true
oder false
wenn ein Element in einer Liste oder einem Tupel vorhanden ist. Ist das Enum.find/3
wirklich der beste Weg, dies zu tun?
Enum.find(["foo", "bar"], &(&1 == "foo")) != nil
x in y
Guard ist sehr performant, da er zur Kompilierungszeit unterschiedliche Funktionsdefinitionen erstellt. Zur Laufzeit ist es weniger performant, entsprichtEnum.member?
, obwohl sie für kleine n in Ordnung sind . Bei großen n und engen Schleifen erzielen Sie eine bessere Leistung durch Hashes wie zMapSet.member?
. Aber in den meisten Fällenx in y
undEnum.member?
sind in Ordnung!Antworten:
Sie können verwenden
Enum.member?/2
Mit einem Tupel möchten Sie zuerst mit in eine Liste konvertieren
Tuple.to_list/1
quelle
Enum.member?/2
innerhalb einer Wache zu verwenden. In diesem Fall müssen Sie sich verlassenin
. Zum Beispiel :def foo(string) when string in ["one", "two"], do: IO.puts(string)
. Das ist übrigens lustig, denn esin
handelt sich um ein Makro, das übersetzt wird inEnum.member?/2
: DBasierend auf den Antworten hier und in Elixir Slack gibt es mehrere Möglichkeiten, um zu überprüfen, ob ein Element in einer Liste vorhanden ist. Per Antwort von @Gazler:
oder einfach
oder
oder wenn Sie den Artikel anstelle von
true
oder suchen und zurückgeben möchtenfalse
Wenn Sie ein Tupel überprüfen möchten, müssen Sie es in eine Liste konvertieren (credit @Gazler):
Aber wie @CaptChrisD in den Kommentaren hervorhob, ist dies eine ungewöhnliche Notwendigkeit für ein Tupel, da man sich normalerweise um die genaue Position des Elements in einem Tupel für den Mustervergleich kümmert.
quelle
Oder verwenden Sie einfach
in
:quelle
Ich habe gestern mit dem Programmieren in Elixir begonnen, aber ich werde etwas ausprobieren, das ich viel in JS gemacht habe. Vielleicht ist es nützlich, wenn die Liste viele Elemente enthält und Sie sie nicht die ganze Zeit mit Enum.member durchlaufen möchten.
Sie können auch eine Kreuzung mit einer anderen Liste abrufen:
quelle
Sie können auch verwenden
Enum.find_value/3
:quelle