来自Erlang list-comprehension的意外空列表

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)

当您添加新字段时,您需要在宏中添加该字段.