2016-03-29 43 views
2

我使用列表理解將數據庫行從元組列表轉換爲地圖列表。有一天,我在數據庫表中添加了一些新的列,並忘記隨時隨地更改代碼。 因此,我發現了一個奇怪的結果:數據庫行變成了一個空列表。在ERL控制檯代碼來自Erlang列表理解的意外空列表

例子:

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

爲什麼二郎不會產生異常錯誤:在這種情況下,不匹配的右手邊值的?

這段代碼是否正常,或者其他語法優先用於執行這種數據轉換?

回答

5

Erlang不會產生任何異常,因爲這是一個正確的語法。發電機{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]. 

而當你添加新的領域,你需要添加的宏領域。

+0

這也不會拋出該異常OP的期望。獲得答案的一部分可能比沒有好,但它也會使得更難發現錯誤。 –

+0

如果你真的需要這個異常,那麼你只需要用'Prepare = fun(X = {_,_})'替換'Prepare = fun(X)'',但我相信那不是重點。 – nikit

1

我不喜歡這個「功能」,因爲根據我的經驗它傾向於掩蓋錯誤,但nikit的回答是正確的關於您看到的結果的原因。

您可以通過移動匹配列表理解的左側的模式得到異常:

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