Erlang映射:删除/2和映射:不删除/2之间的实际区别

Erlang映射:删除/2和映射:不删除/2之间的实际区别,erlang,Erlang,检查“地图”后,我看到了“地图:删除/2”和“地图:不带/2”。我能看到的唯一明显的区别是remove/2接受一个键并返回一个没有该键的地图视图,而without/2接受一个列表并返回一个没有列出键的全新地图 22> M1 = #{foo => bar, spam => eggs}. #{foo => bar,spam => eggs} 23> M2 = maps:without([foo], M1). #{spam => eggs} 24> M3

检查“地图”后,我看到了“地图:删除/2”和“地图:不带/2”。我能看到的唯一明显的区别是remove/2接受一个键并返回一个没有该键的地图视图,而without/2接受一个列表并返回一个没有列出键的全新地图

22> M1 = #{foo => bar, spam => eggs}.
#{foo => bar,spam => eggs}
23> M2 = maps:without([foo], M1).
#{spam => eggs}
24> M3 = maps:remove(foo, M1).
#{spam => eggs}
25> M1.
#{foo => bar,spam => eggs}
26> M2.
#{spam => eggs}
27> M3.
#{spam => eggs}

这有什么实际影响?我很感激不想在内存中创建带有/2的巨型地图副本,但是为什么不删除/2接受列表呢?我假设这两个函数的存在方式是基于性能的,但我不清楚在大多数情况下,我什么时候希望使用一个函数而不是另一个函数(也就是说,我认为维护巨大的映射通常不是一个好主意)。

关于映射的第一件事是,实现可能会改变。正如弗雷德·赫伯特(Fred Hébert)在文章中所写:“检察官办公室团队尊重这一古老的口号:首先让它发挥作用,然后让它变得美丽,只有在需要的时候,才能让它变得快速。”所以不要过于依赖这个答案

目前,
maps:without/2
功能的实现方式如下:

without(Ks, M) when is_list(Ks), is_map(M) ->
    maps:from_list([{K,V}||{K,V} <- maps:to_list(M), not lists:member(K, Ks)]).
当is_list(Ks)、is_map(M)时不带(Ks,M)->

maps:from_list([{K,V}|{K,V})非常好的解释。这让我对这些如何工作有了更多的了解(不仅仅是删除/2和不删除/2)。我现在必须看那个视频。我们还没有看到第二个表示。