Elixir中的所有不可变数据结构都是持久的吗?如果不是,哪一个是哪个,哪个不是?另外,它们如何与Clojure中的持久数据结构进行比较?
Jos*_*lim 24
是的,其中大多数是持久性数据结构.
例如,Elixir列表是链表,链表是退化树(它只有一个分支):
Elixir: list = [1, 2, 3, 4]
Tree: 1 -> 2 -> 3 -> 4
Run Code Online (Sandbox Code Playgroud)
每次将一个元素添加到列表中时,它将共享其尾部:
Elixir: [0|list]
Tree: 0 -> (1 -> 2 -> 3 -> 4)
Run Code Online (Sandbox Code Playgroud)
Elixir的HashSet和HashDict实现基于Clojure的持久数据结构,并且实际上是树.约瑟夫的博客上写了一些内容.
地图也是持久性数据结构,它们非常有趣,因为它们的表示基于键的数量而变化.当你有小地图时,让我们说:
%{:foo => 1, :bar => 2, :baz => 3}
Run Code Online (Sandbox Code Playgroud)
它表示为:
-------------(:foo, :bar, :baz)
|
(map, keys, values)
|
------(1, 2, 3)
Run Code Online (Sandbox Code Playgroud)
因此,每次更新一个密钥时,我们共享"密钥"桶并仅更改值桶.这对于小地图非常有效,但是一旦你得到大约20个密钥,在Erlang 18中,他们改变它们的表示基于Hash Array Mapped Tries,它也类似于Clojure.
注意元组不是持久的(它们代表内存中的连续空间).一旦你更改了元组中的一个元素,就会创建一个全新的元组.这使得它们非常适合保存和访问少量元素以及它们上的模式匹配,但您绝对不希望拥有许多元素.