Elixir Records are deprecated. Das Record
-Modul, das in Elixir existiert jetzt nur für zwei Dinge verwendet:
- mit kurzen, internen Daten zu arbeiten
- Schnittstelle mit Erlang Aufzeichnungen
Dies bedeutet, sollten Sie wahrscheinlich nicht verwenden wenn Sie nicht versuchen, Datensatzinformationen aus einer Erlang-Datei zu extrahieren.
In Bezug auf Ihre ursprüngliche Frage, hier ist, wie ich Erlang Records und Elixir Structs hin und her konvertieren würde. Sobald Sie erkennen, dass eine Struktur nur eine Map
ist, die __struct__: Foo.Bar
enthält, und dass ein Record nur ein Tupel ist, das mit {Foo.Bar, ...}
beginnt, ist es ziemlich einfach. Das einzige knifflige Bit ist, dass die Informationen zu den Datensatzfeldern nur zur Kompilierzeit verfügbar sind. Daher gibt es keine dynamische Möglichkeit, einen Datensatz standardmäßig zu erstellen. Soweit ich weiß, können Sie das nur umgehen, indem Sie die Felddefinitionen irgendwo speichern und sie zum Generieren der Struktur- und Datensatzdefinition verwenden. Später wird dieselbe Quelle wiederverwendet, um ein geordnetes Tupel mit Standardwerten (d. H. Dem Datensatz) zu erzeugen. Denken Sie daran, Sie wirklich sollten keine Datensätze verwenden. Also, sei gewarnt: hässliche Hacks voraus ;-)
defmodule Foo.Bar do
@fields [boo: nil, baz: nil]
def fields, do: @fields
defstruct @fields
end
defmodule Foo do
require Record
Record.defrecord :bar, Foo.Bar, Foo.Bar.fields
end
defmodule Foo.Utils do
require Foo
def record_to_struct(record) do
[{:__struct__, Foo.Bar} | Foo.bar(record)] |> Enum.into(%{})
end
def struct_to_record(struct) do
map = Map.from_struct(struct)
for {key, default} <- Foo.Bar.fields, into: [Foo.Bar] do
Dict.get(map, key, default)
end |> List.to_tuple
end
end
Für diejenigen, die diese Frage sehen könnten, und suchen Sie nicht weiter: Elixier Aufzeichnungen sind veraltet. Sie sind nur vorhanden, damit Elixir mit Erlang-Aufzeichnungen arbeiten kann. –