【问题标题】:Does elixir makes a copy of a map when passed as an function argument?当作为函数参数传递时,elixir 是否会复制地图?
【发布时间】:2016-10-12 18:37:41
【问题描述】:

换句话说,我想知道在 elixir 中,映射是通过值还是通过引用传递给函数的。考虑到 Elixir 的无副作用原则,我怀疑这是按价值计算的。但是大地图不会造成巨大的重复效率低下吗?

提前感谢您的帮助。

【问题讨论】:

    标签: elixir


    【解决方案1】:

    由于 Elixir 中的所有术语都是不可变的,因此无论参数是“按值”传递还是“按引用”传递,用户都没有区别。您永远不能修改函数中术语的值,并将其反映在调用者发送给函数的变量中。 Maps 具体可以被认为是“通过引用”传递的,因为只有指向它们的指针由 VM 发送给函数,这是非常有效的。

    需要注意的一点是,传递给其他进程的术语被 VM 深度复制。唯一的例外是“大”字符串,通常 > 64 字节,作为对全局二进制堆的引用传递,并使用引用计数进行垃圾回收。

    考虑到 Elixir 的无副作用原则,我怀疑这是价值。

    灵药不纯,有副作用。例如,您可以将 I/O 添加到任何函数。您可能意味着没有可变值。

    【讨论】:

    • 我建议将“传递给其他进程的条款”替换为“作为消息发送的条款”
    • @FredtheMagicWonderDog 我想过,但从技术上讲,以下不是“消息”,而是会深度复制地图吗? map = %{...}; spawn(fn -> IO.inspect(map) end)?
    • 好问题。我得考虑一下。
    猜你喜欢
    • 2016-03-03
    • 1970-01-01
    • 1970-01-01
    • 2021-04-05
    • 2015-03-16
    • 2013-02-21
    • 2010-12-14
    • 2014-04-29
    • 1970-01-01
    相关资源
    最近更新 更多