2016-10-12 8 views
3

Другими словами, мне интересно, передается ли в elixir значение функции по значению или по ссылке. Я подозреваю, что это по стоимости, учитывая принцип Эликсира без побочного эффекта. Но тогда не будет ли большая карта создавать огромную неэффективность дублирования?Делает ли эликсир копию карты при передаче в качестве аргумента функции?

Заранее за вашу помощь.

ответ

5

Поскольку все термины в Elixir неизменяемы, для пользователя нет никакой разницы, передается ли аргумент «по значению» или «по ссылке». Вы никогда не сможете изменить значение термина в функции и отразиться в переменной, которую вызывающий абонент отправил функции. Карты можно рассматривать как «по ссылке», так как только указатель на них отправляется в функцию виртуальной машиной, что очень эффективно.

Следует отметить, что термины, переданные другим процессам , являются, глубоко скопированные виртуальной машиной. Единственное исключение - «большие» строки, обычно> 64 байта, которые передаются как ссылка на глобальную кучу двоичных файлов и используют подсчет ссылок для сбора мусора.

Я подозреваю, что это значение имеет принцип Эликсира без побочного эффекта.

Эликсир не является чистым, он имеет побочные эффекты. Например, вы можете добавить I/O к любой функции. Вы, вероятно, не имели никаких изменчивых значений.

+0

Я предлагаю заменить «термины, переданные другим процессам», как «термины, отправленные как сообщения» –

+0

@FredtheMagicWonderDog Я думал об этом, но не является техническим термином, а не «сообщением», но будет глубоко скопировать карту? 'map =% {...}; spawn (fn -> IO.inspect (map) end) '? – Dogbert

+1

Хороший вопрос. Мне нужно подумать об этом. –