【发布时间】:2016-01-24 15:26:28
【问题描述】:
为什么 Phoenix 框架中的“参数”是映射而不是哈希? 任何人都可以解释内部实现级别的详细信息。
【问题讨论】:
-
参数是映射,因为这将是处理此类数据结构的首选方式。 Elixir 中的哈希值仍然存在,因为地图对大型地图(目前)还没有性能。
为什么 Phoenix 框架中的“参数”是映射而不是哈希? 任何人都可以解释内部实现级别的详细信息。
【问题讨论】:
Elixir 将哈希/字典作为核心语言的一部分引入,Erlang VM 不支持哈希。下面的哈希是在地图和关键字列表(成对元组列表)之上实现的。
HashDict 在 top structs 上实现,structs 在 top maps 上实现。
令人困惑的是,elixir 哈希/字典的未来版本将被弃用,只有 2 个数据结构映射和映射集。
【讨论】:
注意:最近使用 EEP 43 将地图引入 Erlang VM。Erlang 17 提供了 EEP 的部分实现,其中仅支持“小地图”。这意味着地图只有在最多存储几十个键时才具有良好的性能特征。为了填补这一空白,Elixir 还提供了 HashDict 模块,该模块使用散列算法提供支持数十万个键的字典,性能良好。
map 的主要优点之一是部分模式匹配:
def edit(conn, %{"id" => id} = params)
...
以上内容将匹配包含字符串id 作为键的任何映射。
在 OTP 18 中,地图的性能有所提高,您可以在 https://gist.github.com/BinaryMuse/bb9f2cbf692e6cfa4841 看到。 HashDict 很可能是deprecated in the future。
在这个答案中有一些关于 Elixir 数据类型的重要信息:What is the benefit of Keyword Lists?
【讨论】: