Ali*_*nau 2 erlang list-comprehension
我使用list comprehension将数据库行从元组列表转换为映射列表.有一天,我在我的数据库表中添加了一些新列,忘了在任何地方更改代码.因此我发现了一个奇怪的效果:数据库行成为一个空列表.
erl控制台中的代码示例:
> DbRows = [{1, 1, 1}, {2, 2, 2}].
[{1,1,1},{2,2,2}]
> [#{<<"col1">> => Col1, <<"col2">> => Col2} ||{Col1, Col2} <- DbRows].
[]
Run Code Online (Sandbox Code Playgroud)
为什么Erlang不会产生异常错误:在这种情况下,右手边值不匹配?
此代码是否正常,或者某些其他语法是否适合执行此类数据转换?
小智 5
Erlang不会生成任何异常,因为这是一种正确的语法.Generator同时{Col1, Col2} <- DbRows也是一个过滤器.因此,任何与模式不匹配的元素都会被跳过.在你的情况下,我会做这样的事情:
-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].
Run Code Online (Sandbox Code Playgroud)
当您添加新字段时,您需要在宏中添加该字段.