首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何使用:dets在药剂中存储地图?

如何使用:dets在药剂中存储地图?
EN

Stack Overflow用户
提问于 2022-05-22 09:59:56
回答 3查看 197关注 0票数 0

我希望能够使用:dets存储地图。

目前,这是我正在努力实现的解决方案:

代码语言:javascript
复制
# a list of strings
topics = GenServer.call(MessageBroker.TopicsProvider, {:get_topics})

# a map with each element of the list as key and an empty list as value
topics_map =
  topics
  |> Enum.chunk_every(1)
  |> Map.new(fn [k] -> {k, []} end)

{:ok, table} = :dets.open_file(:messages, type: :set)

# trying to store the map
:dets.insert(table, [topics_map])

:dets.close(table)

然而,我得到

代码语言:javascript
复制
** (EXIT) an exception was raised:
    ** (ArgumentError) argument error
        (stdlib 3.12) dets.erl:1259: :dets.insert(:messages, [%{"tweet" => [], "user" => []}])

如何才能做到这一点?

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2022-05-22 12:28:12

陈郁的解决方案是好的,但在得到之前,我已经找到了另一个解决方案。基本上,您可以将地图添加到元组中。

代码语言:javascript
复制
:dets.insert(table, {:map, topics_map})

然后,您可以使用

代码语言:javascript
复制
:dets.lookup(table, :map)
票数 1
EN

Stack Overflow用户

发布于 2022-05-22 12:11:33

我被erlang测试过了。你应该先把地图转换成列表。

新()医生

代码语言:javascript
复制
insert_new(Name, Objects) -> boolean() | {error, Reason}
Types
Name = tab_name()
Objects = object() | [object()] 
Reason = term()
Inserts one or more objects into table Name. If there already exists some object with a key matching the key of any of the specified objects, the table is not updated and false is returned. Otherwise the objects are inserted and true returned.

测试代码

代码语言:javascript
复制
dets:open_file(dets_a,[{file,"/tmp/aab"}]).
Map = #{a => 2, b => 3, c=> 4, "a" => 1, "b" => 2, "c" => 4}.
List_a = maps:to_list(Map). %% <----- this line
dets:insert(dets_a,List_a).
票数 1
EN

Stack Overflow用户

发布于 2022-05-22 15:48:50

正如我理解您的意图一样,您希望将userstweets存储在单独的密钥下。为此,首先需要构造关键字列表,而不是地图。

代码语言:javascript
复制
topics = for topic <- topics, do: {topic, []}
# or topics = Enum.map(topics, &{&1, []})
# or topics = Enum.map(topics, fn topic -> {topic, []} end)

然后您可以使用这个关键字列表来创建dets

代码语言:javascript
复制
{:ok, table} = :dets.open_file(:messages, type: :set)
:dets.insert(table, topics)
:dets.close(table)
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/72336508

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档