Erlang通过引用传递细微差别 9>A=list:seq(1,10)。 [1,2,3,4,5,6,7,8,9,10] 13> Fn=乐趣(L)->[0 | L]结束。 #乐趣 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通过引用传递细微差别 9>A=list:seq(1,10)。 [1,2,3,4,5,6,7,8,9,10] 13> Fn=乐趣(L)->[0 | L]结束。 #乐趣 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,pass-by-reference,Erlang,Pass By Reference,如果erlang在内部通过引用()传递,为什么A的值不反映更改 通过引用传递或erlang我缺少什么基本信息?列表是形式L=[Head | Tail]的递归构造,其中Head是任何有效的erlang术语,Tail应该是列表(如果它是其他内容,则称为不正确的列表,不在本讨论的范围内) 表示L作为引用传递意味着: 无需复制函数参数中的列表(适用于过程堆栈:o) 函数返回一个值,它从不修改任何参数 在您的特定情况下,甚至不需要制作一个副本来创建返回的列表。因为变量是不可变的,如果你写B=Fn(A),

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


通过引用传递erlang我缺少什么基本信息?

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

表示L作为引用传递意味着:

  • 无需复制函数参数中的列表(适用于过程堆栈:o)
  • 函数返回一个值,它从不修改任何参数
  • 在您的特定情况下,甚至不需要制作一个副本来创建返回的列表。因为变量是不可变的,如果你写B=Fn(A),那么B将包含A,它将正好是[0 | A]

您没有分配给
L
,而是创建了一个带有
[0 | L]
的新列表。Erlang中的所有变量都是不可变的,因此您无法更改L的值。只需添加一个小东西。我认为出现问题的主要原因是,在其他语言中将erlang列表视为数组。但事实并非如此。Erlang列表正是数据结构中的链表。所以L=[Head | Tail]是链表的一个节点,它的Head作为Head值,Tail作为下一个值。我希望这会有帮助。
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]