【问题标题】:Adding to an existing value in Erlang添加到 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=#added{value = Number + #added.value}.

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

【问题讨论】:

  • 在 Erlang 中,所有“变量”都是不可变的,因此您只能更改录音的副本。

标签: erlang record erl


【解决方案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}.

【讨论】:

    【解决方案2】:
    -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
    

    【讨论】:

      猜你喜欢
      • 2012-02-20
      • 2020-10-12
      • 1970-01-01
      • 1970-01-01
      • 2017-01-07
      • 2014-03-26
      • 2019-05-28
      • 2023-03-18
      • 1970-01-01
      相关资源
      最近更新 更多