2011-01-10 63 views
3

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

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 

回答

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 
+0

是否可以申报全球记录? – Bertaud 2011-01-10 16:08:32

+0

@Bertaud,全局变量违背了Erlang的设计原则。即使变量是全局变量,但由于Erlang中变量的不变性,您无法对其进行修改。如果你仍然想使用,你可以使用put和get来存储记录在进程字典中(只能被进程访问,但不需要在函数中传递数据)或使用ets表。 – 2011-01-10 16:19:56

0

在fct()中,您不会改变记录,但是您将为记录返回一个新值,需要进一步使用它。如果你打电话给fct(S),而没有处理返回值,那么你将失去新的价值(“titi”)。

2

Erlang中的所有数据都是不可变的,这是不可能的。所以要做一些类似于你原来的问题的事情,你需要像@hdima那样修改它。记录不会更新,但会被重写。在Erlang中没有全局数据,所有的数据都属于一个进程。 ETS表甚至是如此,因为它们基本上像一个过程一样,尽管它是一个没有明确通信的内置过程。

所以如果你使用过程字典或ETS表数据本身永远不能更新,只有字典/表。这意味着,修改中的一些数据字典/表,你基本上要:

  1. “读”数据
  2. 更新的数据作出新的数据
  3. “写”新回词典/表

没有将新数据写回到字典/表中,它将会丢失,因为您的新数据是。