添加到 Erlang 中的现有值
Adding to an existing value in Erlang
我正在尝试创建一个将数字存储到记录中的函数,然后在每次函数运行时将值 X 添加到该数字。
Value: 5
Run Function (Add One): 1
Value should be: 6
Run Function (Add One): 1
value should be 7
我尝试使用一条记录:
-record(adder,{value :: integer()}).
---function
Number = random:uniform(6),
L=#added{value = Number + #added.value}.
这不起作用,因为它每次都会重置值。有什么建议吗?
看看这段代码:
-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}.
-record(adder, {value = 5}).
add(Value) ->
add(#adder{}, Value).
add(#adder{value =V} = Adder, Value) ->
Adder#adder{value = V + Value}.
test() ->
R1 = add(1),
io:format("~p~n", [R1]),
R2 = add(R1, 10),
io:format("~p~n", [R2]).
这是 运行 test:test().
的输出
6> c(test).
{ok,test}
7> test:test().
{adder,6}
{adder,16}
ok
我正在尝试创建一个将数字存储到记录中的函数,然后在每次函数运行时将值 X 添加到该数字。
Value: 5
Run Function (Add One): 1
Value should be: 6
Run Function (Add One): 1
value should be 7
我尝试使用一条记录:
-record(adder,{value :: integer()}).
---function
Number = random:uniform(6),
L=#added{value = Number + #added.value}.
这不起作用,因为它每次都会重置值。有什么建议吗?
看看这段代码:
-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}.
-record(adder, {value = 5}).
add(Value) ->
add(#adder{}, Value).
add(#adder{value =V} = Adder, Value) ->
Adder#adder{value = V + Value}.
test() ->
R1 = add(1),
io:format("~p~n", [R1]),
R2 = add(R1, 10),
io:format("~p~n", [R2]).
这是 运行 test:test().
6> c(test).
{ok,test}
7> test:test().
{adder,6}
{adder,16}
ok