首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >添加到Erlang中的现有值

添加到Erlang中的现有值
EN

Stack Overflow用户
提问于 2015-05-20 00:34:57
回答 2查看 189关注 0票数 1

我试图创建一个函数,该函数将一个数字存储到一个记录中,然后在该函数每次运行时向该数字添加值X。

代码语言:javascript
运行
复制
Value: 5
Run Function (Add One):   1
Value should be: 6
Run Function (Add One):   1
value should be 7

我试着用唱片:

代码语言:javascript
运行
复制
-record(adder,{value :: integer()}).

---function 
   Number = random:uniform(6),
        L=#added{value = Number + #added.value}.

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

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2015-05-20 05:08:36

看看下面的代码:

代码语言:javascript
运行
复制
-module(test).
-export([add/1]).

-record(adder, {value=6}).

add(X) ->
    #adder{value = X + #adder.value}.

如果在shell中编译这一点,任何对"add(3)“的调用都会导致"{adder,5}”而不是"{adder,9}“。看一看:

代码语言:javascript
运行
复制
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。更改记录的定义:

代码语言:javascript
运行
复制
-module(test).
-export([add/1]).

-record(adder, {field1, field2, value=6}).

add(X) ->
    #adder{value = X + #adder.value}.

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

代码语言:javascript
运行
复制
1> c(test).
{ok,test}
2> test:add(3).
{adder,undefined,undefined,7}

我问过自己,你是怎么提出这个问题的。你不想让你的功能像这样吗?

代码语言:javascript
运行
复制
add2(#adder{value = V} = R, X) ->
    R#adder{value = V + X}.
票数 1
EN

Stack Overflow用户

发布于 2015-05-20 05:51:16

代码语言:javascript
运行
复制
-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().的输出

代码语言:javascript
运行
复制
6> c(test).
{ok,test}
7> test:test().
{adder,6}
{adder,16}
ok
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/30338353

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档