以记录为键的映射 - 如何检查 Erlang 中是否存在键

Map with record as key - how to check if key exists in Erlang

我想制作一张地图,其中记录作为键,列表作为值,但我在检查是否已存在类似键时遇到问题 - 或者更确切地说,我不知道如何制作它在 Erlang 工作。

我有一个包含三个值的记录,我需要检查映射中是否有至少一个值相等的键。

我是这样看的:

-record(r, {A, B, C}).
addRecord(newA, newB, newC, Map) ->
  case maps:is_key(#r{A = newA, B = _, C = _}, Map) or maps:is_key(#r{A = _, B = newB, C = _}, Map) or maps:is_key(#r{A = _, B = _, C = newC}, Map) of
    true -> threo("...")
    _ -> maps:put(#r(A = newA, B = newB, C = newC), [], Map)
end.

我的想法是在 maps:is_key 中将 _ 作为 "any value",但这在 Erlang 中行不通。

您知道如何检查它(可能很容易)吗?

好吧,没有特别便宜的方法。您可能需要检查地图的所有键。简单的方法是

lists:any(fun(X) -> 
              is_record(X, r) andalso 
              (X#r.A == newA orElse X#r.B == newB orElse X#r.C == newC) 
          end, 
          maps:keys(Map))

(我在您的示例中使用了 A 等,以使其更易于比较,但字段名称必须是原子,因此它们应该是 a'A' ).

一种更便宜的方法是使用 maps:iterator:内存更少,如果找到合适的密钥可以提前停止。但是代码会复杂得多。