2016-03-29 7 views
2

Ich benutze List Verständnis für die Umwandlung von Datenbank Zeilen aus der Liste der Tupel in die Liste der Karten. Eines Tages habe ich eine neue Spalte in meine Datenbanktabelle eingefügt und vergessen, den Code überall zu ändern. Und deshalb habe ich einen seltsamen Effekt entdeckt: Datenbankzeilen werden zu einer leeren Liste.Unerwartete leere Liste von Erlang Listenverstehen

Beispiel für Code in erl Konsole:

> DbRows = [{1, 1, 1}, {2, 2, 2}]. 
[{1,1,1},{2,2,2}] 
> [#{<<"col1">> => Col1, <<"col2">> => Col2} ||{Col1, Col2} <- DbRows]. 
[] 

Warum Erlang erzeugt keine Ausnahmefehler: keine Übereinstimmung der rechten Seite Wert in diesem Fall?

Ist dieser Code OK, oder wird eine andere Syntax für die Durchführung solcher Datentransformationen bevorzugt?

Antwort

5

Erlang erzeugt keine Ausnahme, weil das eine richtige Syntax ist. Generator {Col1, Col2} <- DbRows ist ein Filter in der gleichen Zeit. Jedes Element, das nicht mit dem Muster übereinstimmt, wird einfach übersprungen. In Ihrem Fall würde ich so etwas tun:

-define(FIELDS, [id, some1, some2]). 
DbRows = [{1, 1, 1}, {2, 2, 2}]. 
Prepare = fun(X) -> 
    maps:from_list(lists:zip(?FIELDS, tuple_to_list(X))) 
end. 
[ Prepare(Row) || Row <- DbRows]. 

Und wenn Sie neues Feld hinzufügen, müssen Sie das Feld in dem Makros hinzuzufügen.

+0

erwartet Dies auch nicht werfen die OP Ausnahme. Einen Teil der Antwort zu bekommen ist vielleicht besser als nichts, aber es würde es auch schwieriger machen, den Fehler zu erkennen. –

+0

Wenn Sie wirklich die Ausnahme benötigen, müssen Sie 'Prepare = fun (X)' nur durch 'Prepare = fun (X = {_, _})' ersetzen, aber ich glaube, das ist nicht der Punkt. – nikit

1

Ich mag dieses "Feature" nicht, da es meiner Erfahrung nach dazu neigt, Bugs zu maskieren, aber Nikits Antwort ist korrekt über den Grund für das Ergebnis, das Sie sehen.

Sie können die Ausnahme erhalten, indem das Muster auf der linken Seite der Liste Verständnis passend zu bewegen:

[ case Row of {Col1, Col2} -> #{<<"col1">> => Col1, <<"col2">> => Col2} || Row <- DbRows ]