2016-10-12 6 views
3

つまり、エリクシルでマップが値または参照によって関数に渡されるのかどうか疑問に思っています。私はそれが副作用のないElixirの原則を与えられたことは価値があると思う。しかし、大規模な地図では重複した非効率性が生まれませんか?elixirは関数の引数として渡されたときマップのコピーを作成しますか?

ご協力いただきありがとうございます。

答えて

5

エリクサーのすべての用語は不変なので、引数が "値渡し"または "参照渡し"のどちらに渡されるかはユーザーに違いありません。ある関数内のある項の値を修正することはできず、それを呼び出し側が関数に送った変数に反映させることはできません。マップは、「参照によって」渡されたと見なすことができます。ポインタはVMによって関数に送信され、非常に効率的です。

他のプロセスに渡される用語はで、はVMによって深くコピーされます。唯一の例外は、グローバルバイナリヒープへの参照として渡される "大規模な"文字列、通常は> 64バイトで、ガベージコレクションの参照カウントを使用します。

エリクサーの副作用のない原則があると思われます。

エリクサーは純粋ではなく、副作用があります。たとえば、任意の機能にI/Oを追加することができます。おそらく、変更可能な値は意味しませんでした。

+0

"他のプロセスに渡された用語"を "メッセージとして送信される用語"に置き換えることをお勧めします –

+0

@FredtheMagicWonderDog私はそれについて考えましたが、技術的には "メッセージ"ではありませんが、 'map =%{...}; spawn(fn - > IO.inspect(map)end) '? – Dogbert

+1

良い質問です。私はそのことについて考える必要があります。 –

関連する問題