添加到 Erlang 中的现有值

Posted

技术标签:

【中文标题】添加到 Erlang 中的现有值【英文标题】:Adding to an existing value in Erlang 【发布时间】:2015-08-01 00:46:48 【问题描述】:

我正在尝试创建一个函数,该函数将一个数字存储到记录中,然后每次运行该函数时将值 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=#addedvalue = Number + #added.value.

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

【问题讨论】:

在 Erlang 中,所有“变量”都是不可变的,因此您只能更改录音的副本。 【参考方案1】:

看看这段代码:

-module(test).
-export([add/1]).

-record(adder, value=6).

add(X) ->
    #addervalue = 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) ->
    #addervalue = X + #adder.value.

现在,重新编译代码并再次调用 add(3) 将导致

1> c(test).
ok,test
2> test:add(3).
adder,undefined,undefined,7

我问过自己,你是怎么想出这个问题的。你不希望你的函数是这样的吗?

add2(#addervalue = V = R, X) ->
    R#addervalue = V + X.

【讨论】:

【参考方案2】:
-record(adder, value = 5).

add(Value) ->
    add(#adder, Value).

add(#addervalue =V = Adder, Value) ->
    Adder#addervalue = 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

【讨论】:

以上是关于添加到 Erlang 中的现有值的主要内容,如果未能解决你的问题,请参考以下文章

Erlang:用新功能“扩展”现有模块

如何从 Erlang 中的对列表中获取元素

erlang中的字符串值

进程中的 Erlang 错误,退出值为 undef

在 Erlang 中将消息路由到 PID

Erlang - **异常错误:右侧值不匹配