http://blog.csdn.net/yuanfengyun/article/details/51842319
在erlang中,由于沒(méi)有變量的概念,生成一個(gè)結(jié)構(gòu)以后不能夠修改,只能修改后生成新的結(jié)構(gòu)。這樣持有一個(gè)對(duì)象變得比較困難。利用進(jìn)程典存放生成的結(jié)構(gòu),通過(guò)ID進(jìn)行索引,在生成結(jié)構(gòu)時(shí),返回{結(jié)構(gòu)類型,ID},這樣就可以實(shí)現(xiàn)形如Player = player:new(), Player:set_name(), Player:get_name()這樣(C++、C#、Java)類似類的使用。
定義了一個(gè)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).
-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().
設(shè)置name
P:set_name("myname").
獲取name
Name = P:get_name().
實(shí)現(xiàn)中是將數(shù)據(jù)通過(guò)ID索引放在了進(jìn)程字典中,如果需要跨進(jìn)程訪問(wèn),可以放在ets中。