Erlang和记录

时间:2011-01-10 15:48:47

标签: erlang record

此代码有什么问题? "titi"我预计会person.name,但我仍有"toto"! 更明确地说,如何修改函数中的记录?

init1()->
    S=#person{name="toto"},   %record creation and field setting
    fct(S),
    io:format("~s~n",[S#person.name]).

fct(R)->
    R#person{name="titi"}.    %record updating

4 个答案:

答案 0 :(得分:10)

你需要得到fct()的结果:

init1()->
    S=#person{name="toto"},   %record creation and field setting
    S2 = fct(S),   % Get updated record
    io:format("~s~n",[S2#person.name]).

fct(R)->
    R#person{name="titi"}.    %record updating

答案 1 :(得分:7)

贝尔托,我认为你有点超越自己。在编写更多代码之前,您确实需要了解不可变性的基础知识。 (即“变量”不会改变:你只能为它们分配一次值。)我建议你阅读http://learnyousomeerlang.com/免费在线指南“向大家学习一些Erlang”。涵盖变量基础的部分是http://learnyousomeerlang.com/starting-out-for-real#invariable-variables

答案 2 :(得分:2)

不可能过分强调Erlang中的所有数据都是不可变的。所以要像你原来的问题那样做,你需要像@hdima那样修改它。记录未更新但已重写。同样,Erlang中没有全局数据,所有数据都属于一个进程。这对于ETS表来说甚至是正确的,因为它们基本上表现得像一个过程,尽管它是一个没有显式通信的内置过程。

因此,如果您使用流程字典或ETS表,则数据本身永远不会更新,只能更新字典/表。这意味着要修改字典/表格中的某些数据,您基本上必须:

  1. “读取”数据
  2. 更新制作新数据的数据
  3. 将“新”写回字典/表格
  4. 如果没有将新数据写回字典/表格,它将会丢失,因为您的新数据是。

答案 3 :(得分:0)

在fct()中,你没有改变记录,但是你要为记录返回一个新值,需要进一步使用。如果您在不处理返回值的情况下调用fct(S),那么您将丢失该新值(“titi”)。