1

我正在尝试创建一个将数字存储到记录中的函数,然后在每次函数运行时将值 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}.

这不起作用,因为它每次都会重置值。有什么建议么?

4

2 回答 2

1

看看这段代码:

-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}.
于 2015-05-20T05:08:36.547 回答
0
-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
于 2015-05-20T05:51:16.047 回答