看看这段代码:
-module(test).
-export([add/1]).
-record(adder, {value=6}).
add(X) ->
#adder{value = X + #adder.value}.
如果你在你的 shell 中编译它,任何对“add(3)”的调用都会产生“{adder,5}”而不是“{adder, 9}”。看一看:
Eshell V6.4 (abort with ^G)
1> c(test).
{ok,test}
2> test:add(3).
{adder,5}
3> test:add(3).
{adder,5}
怎么来的?这是因为记录实际上是元组。最后一行中的表达式“#adder.value”被评估为加法器元组中字段“value”的位置,即 2。让我们有一些证据。更改记录的定义:
-module(test).
-export([add/1]).
-record(adder, {field1, field2, value=6}).
add(X) ->
#adder{value = X + #adder.value}.
现在,重新编译代码并再次调用 add(3) 将导致
1> c(test).
{ok,test}
2> test:add(3).
{adder,undefined,undefined,7}
我问过自己,你是怎么想出这个问题的。你不希望你的功能是这样的吗?
add2(#adder{value = V} = R, X) ->
R#adder{value = V + X}.