在erlang中,由於沒有變量的概念,生成一個結構以後不能夠修改,只能修改後生成新的結構。這樣持有一個對象變得比較困難。利用進程典存放生成的結構,通過ID進行索引,在生成結構時,返回{結構類型,ID},這樣就可以實現形如Player = player:new(), Player:set_name(), Player:get_name()這樣(C++、C#、JAVA)類似類的使用。
定義了一個player的類
-module(player).
-record(player,{id,name,age}).
-compile(export_all).
id()->
case get(player_id) of
undefined->
put(player_id,1),
1;
ID->
NewID = ID + 1,
NewID
end.
new()->
ID = id(),
Player = #player{id=ID},
put({player,ID},Player),
{player,ID}.
get_name({player,ID})->
#player{name=Name} = get({player,ID}),
Name.
set_name(Name,{player,ID})->
Player = get({player,ID}),
NewPlayer = Player#player{name=Name},
put({player,ID},NewPlayer).
get_age({player,ID})->
#player{age=Age} = get({player,ID}),
Age.
set_age(Age,{player,ID})->
Player = get({player,ID}),
NewPlayer = Player#player{age=Age},
put({player,ID},NewPlayer).
用法
P = player:new().
設置name
P:set_name("myname").
獲取name
Name = P:get_name().
實現中是將數據通過ID索引放在了進程字典中,如果需要跨進程訪問,可以放在ets中。