如何从Elixir中的ETS返回一个值



我有一个ETS表,它的键值方案如下:

users = :ets.tab2list(:users)
IO.inspect users # printing
[
{"3eadd68495d",
%UserType{
name: "John",
id: "3eadd68495d",
status: "Free"
}},
{"234a34495d",
%UserType{
name: "Steve",
id: "234a34495d",
status: "Free"
}},
{"9add68495d",
%UserType{
name: "Mike",
id: "9add68495d",
status: "Busy"
}}
]

我想得到任何元素的一个id,它们具有状态";免费";。

我已经尝试使用循环获取值

users = :ets.tab2list(:users)
for user <- users do
userValue = user |> elem(1)
if userValue.status === "Free" do
userValue.id
end
end

但它返回多个id值(3eadd68495d234a34495d(,而不是一个

我需要smth这样的"中断";在if userValue.status === "Free" do userValue.id之后,但我不知道如何在Elixir中使用它。

对于单个值,应该使用Enum.reduce_while/3

Enum.reduce_while(users, nil, fn
{_, %UserType{status: "Free", id: id}}, _ -> {:halt, id}
_, acc -> {:cont, acc}
end)

或者正如@sabiwara在评论中指出的那样,使用Enum.find_value/2


我不建议这样做,但可以使用try/catch来"打破"for的理解,如下所示。

try do
for {_, %UserType{status: "Free", id: id}} <- users, do: throw(id)
catch
id -> id
end

旁注:一般来说,它效率极低,一旦您已经拥有ETS,您最好使用:ets.select/2,如中所述https://write.as/yuriploc/ets-dets-match-patterns-and-specifications

下面几行应该做

:ets.select(
:users,
[{{:_, %{status: :"$1", id: :"$2"}},
[{:"==", :"$1", "Free"}],
[:"$2"]}])

相关内容

  • 没有找到相关文章

最新更新