1. ホーム
  2. immutability

Elixirの変数は本当にイミュータブルなのか?

2023-09-06 20:10:30

質問

Dave Thomas氏の著書「Programming Elixir」では、「Elixir enforces immutable data"」と書かれており、さらに次のようなことが書かれています。

Elixirでは、一度変数が[1,2,3]のようなリストを参照すると、(変数を再バインドするまで)常にその同じ値を参照することが分かっています。

これは、quot; it won't ever change unless you change it"のように聞こえるので、mutableとreboundの違いが何であるのか混乱しています。違いを強調する例があれば、本当に助かります。

どのように解決するのですか?

不変性とは、データ構造が変化しないことを意味します。例えば関数 HashSet.new は空の集合を返しますが、その集合への参照を保持する限り、それが空でなくなることは決してありません。あなたは ができること しかし、Elixirでできることは、何かへの変数の参照を捨てて、新しい参照に束縛し直すことです。例えば

s = HashSet.new
s = HashSet.put(s, :element)
s # => #HashSet<[:element]>

できない は、明示的に再バインドすることなく、その参照の下の値が変更されることです。

s = HashSet.new
ImpossibleModule.impossible_function(s)
s # => #HashSet<[:element]> will never be returned, instead you always get #HashSet<[]>

これをRubyと対比すると、以下のようなことができます。

s = Set.new
s.add(:element)
s # => #<Set: {:element}>