为了将orddict的值(记录)提取为排序列表,尝试了这个:
-module(test).
-compile(export_all).
-record(node, {name="", cost=0}).
test() ->
List = orddict:append("A",#node{name="A",cost=1},
orddict:append("B",#node{name="B",cost=2},
orddict:new())),
lists:sort(fun({_,A},{_,B}) -> A#node.cost =< B#node.cost end,
orddict:to_list(List)).
排序因exception error: {badrecord,node}
而失败
什么是正确的语法?
正确的插入方法是orddict:store/2
,而不是orddict:append/2
。然后模式{_,A}
匹配比较函数。
答案 0 :(得分:2)
正确的语法是:
lists:sort(fun({_,[A]},{_,[B]}) -> A#node.cost =< B#node.cost end,
orddict:to_list(List)).
我没有在文档中找到关于此的说明,但您可以查看模块的source code。
正如@Pascal在评论中写的那样,原因是orddict:append/3是一个函数,用于将值附加到现有的Key / Value对,其中Value必须是一个列表。在用例中,密钥不存在,因此创建了对,并且值附加到空列表。
顺便说一句,您总是可以打印并比较实际和预期的结果。
io:format("~p~n",[orddict:to_list(List)])
对于您的示例:
[{"A",[{node,"A",1}]},{"B",[{node,"B",2}]}]