此代码有什么问题?
"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
答案 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)
答案 2 :(得分:2)
不可能过分强调Erlang中的所有数据都是不可变的。所以要像你原来的问题那样做,你需要像@hdima那样修改它。记录未更新但已重写。同样,Erlang中没有全局数据,所有数据都属于一个进程。这对于ETS表来说甚至是正确的,因为它们基本上表现得像一个过程,尽管它是一个没有显式通信的内置过程。
因此,如果您使用流程字典或ETS表,则数据本身永远不会更新,只能更新字典/表。这意味着要修改字典/表格中的某些数据,您基本上必须:
如果没有将新数据写回字典/表格,它将会丢失,因为您的新数据是。
答案 3 :(得分:0)
在fct()中,你没有改变记录,但是你要为记录返回一个新值,需要进一步使用。如果您在不处理返回值的情况下调用fct(S),那么您将丢失该新值(“titi”)。