Verwenden String.to_existing_atom/1
und Map.get/2
(als structs tatsächlich Karten sind):
iex(1)> defmodule MyStruct do
...(1)> defstruct [:key1, :key2]
...(1)> end
iex(2)> var1 = "key1"
"key1"
iex(3)> struct1 = %MyStruct{key1: "fdsfd", key2: 33}
%MyStruct{key1: "fdsfd", key2: 33}
iex(4)> val1 = Map.get(struct1, String.to_existing_atom(var1))
"fdsfd"
Die [:key]
Syntax wird nicht mit structs arbeiten Standardmäßig wird das Protokoll Access
verwendet, das vom Benutzer für jede Struktur implementiert werden muss.
String.to_existing_atom/1
wird einen Fehler ausgeben, wenn das Atom noch nicht existiert, aber sicherer ist als die Konvertierung beliebiger Eingaben in Atom und es wird definitiv existieren, wenn Sie eine Struktur mit diesem Schlüssel bereits definiert haben. Weitere Details finden Sie unter this question.
ist es notwendig, var1 an ein Atom zu konvertieren? – Johshi
Sie könnten iterieren Alle Felder der Struktur, konvertieren Sie die Schlüssel in Zeichenfolge, und vergleichen Sie diese, aber es wäre viel langsamer. So etwas wie: 'struct1 |> Map.from_struct |> Enum.find (fn {Schlüssel, _} -> Atom.to_string (key) == var1 end)'. – Dogbert
aber ist kein Atom ein Schlüssel einer Struct Synonim zu einer Zeichenkette? – Johshi