Erlang传递引用的细微差别

时间:2015-06-05 13:49:23

标签: erlang pass-by-reference

9> A = lists:seq(1,10).
[1,2,3,4,5,6,7,8,9,10]
13> Fn = fun (L) -> [0|L] end.
#Fun<erl_eval.6.90072148>
14> Fn(A).
[0,1,2,3,4,5,6,7,8,9,10]
15> A.
[1,2,3,4,5,6,7,8,9,10]

如果erlang内部通过引用传递(see this),为什么A的值不反映更改?

我错过了什么基本的传递引用 erlang

1 个答案:

答案 0 :(得分:3)

列表是L = [Head | Tail]形式的递归构造,其中Head是任何有效的erlang术语,Tail应该是一个列表(如果是其他L则称为不正确的列表,超出范围这个讨论)。

说L作为参考传递意味着:

  • 没有必要在函数参数中复制列表(适用于进程堆栈:o);
  • 该函数返回一个值,它永远不会修改任何参数;
  • 在您的特定情况下,甚至不需要复制A来创建返回的列表。由于变量不可变,如果你写B = Fn(A),那么B将包含A,它将完全是[0 | A]。