Are all immutable data structures in Elixir persistent? If not, which of them are and which not? Also, how do they compare to the persistent data structures in Clojure?
答案 0 :(得分:23)
是的,大多数都是持久性数据结构。
例如,Elixir列表是链表,链表是退化树(它只有一个分支):
Elixir: list = [1, 2, 3, 4]
Tree: 1 -> 2 -> 3 -> 4
每次将一个元素添加到列表中时,它都会分享它的尾部:
Elixir: [0|list]
Tree: 0 -> (1 -> 2 -> 3 -> 4)
Elixir的HashSet和HashDict实现基于Clojure的持久数据结构,并且实际上是树。 There is some write up on Joseph's blog
地图也是持久性数据结构,它们非常有趣,因为它们的表示会根据键的数量而变化。当你有小地图时,请说:
%{:foo => 1, :bar => 2, :baz => 3}
表示为:
-------------(:foo, :bar, :baz)
|
(map, keys, values)
|
------(1, 2, 3)
因此,每次更新一个密钥时,我们都会共享"密钥"存储桶并仅更改值桶。这对于小地图非常有效,但是一旦你得到大约20个密钥,在Erlang 18中,他们将其表示改为基于Hash Array Mapped Tries,这也类似于Clojure。
注意元组不是持久的(它们代表内存中的连续空间)。一旦你更改了元组中的一个元素,就会创建一个全新的元组。这使得它们非常适合持有和访问少量元素以及模式匹配,但你绝对不想拥有许多元素。