"two"} # = %{a: "one", b: "two"} > map.a -6ren">
gpt4 book ai didi

elixir - 关键词列表有什么好处?

转载 作者:行者123 更新时间:2023-12-03 04:49:07 26 4
gpt4 key购买 nike

在 Elixir 中我们有 map :

> map = %{:a => "one", :b => "two"} # = %{a: "one", b: "two"}
> map.a # = "one"
> map[:a] # = "one"

我们还有关键字列表:

> kl = [a: "one", b: "two"]       # = [a: "one", b: "two"]
> kl2 = [{:a, "one"},{:b, "two"}] # = [a: "one", b: "two"]
> kl == kl2 # = true
> kl[:a] # = "one"
> kl.a # = ** (ArgumentError)

为什么两者都有?

语法?是因为关键字列表具有更灵活的语法,允许在没有花括号甚至没有括号作为函数调用的最后一个参数的情况下定义它们吗?那么为什么不给 Maps 这个语法糖呢?

重复键?是因为关键字列表可以有重复键吗?为什么您需要 map 样式访问和重复键?

性能?是因为关键字列表具有更好的性能吗?那为什么要有 map 呢?映射在通过键查找成员时不应该比元组列表更高效吗?

类似 JS Array 和 Ruby Hash 的外观?是吗?

我知道在结构上它们是不同的数据表示。在我看来,elixir 中的关键字列表通过异常语法(3 种不同的语法变体)、用例与 map 重叠以及不明确的好处使语言变得复杂。

使用关键字列表有什么好处?

最佳答案

<表类=“s-表”><标题>关键字列表 map /结构HashDict(已弃用) <正文>重复的键是没有没有已订购是没有没有模式匹配是是的没有性能1(插入)非常快²快3快⁴性能1(访问)慢⁵快3快⁴

关键字列表是轻量级的,并且其下方的结构简单,这使得它们非常灵活。您可以将它们视为 Erlang 约定之上的语法糖,从而可以轻松与 Erlang 交互,而无需编写太难看的代码。例如,关键字列表用于表示函数参数,这是从 Erlang 继承的属性。在某些情况下,关键字列表是您唯一的选择,特别是当您需要重复键或排序时。它们只是具有与其他替代方案不同的属性,这使得它们更适合某些情况,而不太适合其他情况。

映射(和结构)用于存储实际的有效负载数据,因为它们具有基于哈希的实现。关键字列表内部只是每次操作都需要遍历的列表,因此不具备恒定时间访问等经典键值数据结构的属性。

Elixir还推出了HashDict作为 poor performance of maps at the time it was written 的解决方法。然而,从 Elixir 1.0.5/Erlang 18.0 和 HashDict 开始,这个问题现已修复。 will be deprecated in future versions .

如果您深入研究 Erlang 标准库,您会发现还有更多存储键/值对的数据结构:

  • proplists – 类似于 Elixir 关键字列表
  • maps – 与 Elixir map 相同
  • dict – 从 Erlang 原语构建的键值字典
  • gb_trees – 一般平衡树

当您需要跨多个进程和/或虚拟机存储键/值对时,您还可以选择以下选项:

  • ets/dets –(基于磁盘)Erlang术语存储
  • mnesia – 分布式数据库
<小时/>

¹ 一般来说,但当然这取决于™。

² 最好的情况只是添加到列表前面。

³ 适用于 Elixir 1.0.5 及更高版本,旧版本可能会较慢。

HashDict现已弃用。

⁵ 需要线性搜索,平均扫描一半元素。

关于elixir - 关键词列表有什么好处?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28180366/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com