如何在ETS中获取目标值?仅提取值而非键值对的方法
获取ETS查询结果中的值
推荐方案:用:ets.lookup_element/3直接取值
:ets.lookup/2会返回包含键值元组的列表,而:ets.lookup_element/3是Erlang提供的专用函数,能直接返回目标值,省去处理列表的步骤:
# 假设表中存储的是 {key, value} 格式的元组 value = :ets.lookup_element(:table, key, 2)
第三个参数2指定取元组的第2个元素(也就是值的位置),如果你的元组结构是{key, field_a, field_b}这类多字段格式,只需把这个数字改成对应值的位置即可。
注意:如果查询的键不存在,这个函数会抛出ArgumentError。要避免异常的话,可以先判断键是否存在:
value = if :ets.member(:table, key) do :ets.lookup_element(:table, key, 2) else # 键不存在时的默认值,比如nil或者自定义逻辑 nil end
备选方案:模式匹配处理:ets.lookup/2的结果
如果已经调用了:ets.lookup/2,可以通过模式匹配直接提取值:
case :ets.lookup(:table, key) do [{^key, target_value}] -> target_value [] -> nil # 键不存在时返回nil,或者写你的处理逻辑 end
如果你的ETS表是set类型(默认类型),:ets.lookup/2最多返回一个元组,上述模式匹配完全安全。要是用的是bag或duplicate_bag类型(允许多个相同键的条目),可以把结果转成值的列表:
values = :ets.lookup(:table, key) |> Enum.map(fn {_, val} -> val end)
内容的提问来源于stack exchange,提问作者olddev
相关产品推荐
相关产品推荐

