Erlang 传递引用的细微差别
Erlang pass-by-reference nuances
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,我缺少什么基本原理?
列表是 L=[Head|Tail] 形式的递归构造,其中 Head 是任何有效的 erlang 术语,Tail 应该是列表(如果它是其他东西,L 被称为不正确的列表,在本次讨论的范围)。
说 L 作为引用传递意味着:
- 没有必要在函数参数中复制列表(对进程堆栈有好处 :o);
- 函数returns一个值,它从不修改任何参数;
- 在您的特定情况下,甚至不需要复制 A 来创建返回列表。由于变量是不可变的,如果你写 B = Fn(A),那么 B 将包含 A,它将正好是 [0|A].
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,我缺少什么基本原理?
列表是 L=[Head|Tail] 形式的递归构造,其中 Head 是任何有效的 erlang 术语,Tail 应该是列表(如果它是其他东西,L 被称为不正确的列表,在本次讨论的范围)。
说 L 作为引用传递意味着:
- 没有必要在函数参数中复制列表(对进程堆栈有好处 :o);
- 函数returns一个值,它从不修改任何参数;
- 在您的特定情况下,甚至不需要复制 A 来创建返回列表。由于变量是不可变的,如果你写 B = Fn(A),那么 B 将包含 A,它将正好是 [0|A].