0xA*_*xAX 6 erlang list record
例如,我有erlang记录:
-record(state, {clients
}).
Run Code Online (Sandbox Code Playgroud)
我可以从客户字段列表中制作吗?
我可以保留在正常列表中的客户端?如何在此列表中添加一些值?
谢谢.
也许你的意思是:
-module(reclist).
-export([empty_state/0, some_state/0,
add_client/1, del_client/1,
get_clients/1]).
-record(state,
{
clients = [] ::[pos_integer()],
dbname ::char()
}).
empty_state() ->
#state{}.
some_state() ->
#state{
clients = [1,2,3],
dbname = "QA"}.
del_client(Client) ->
S = some_state(),
C = S#state.clients,
S#state{clients = lists:delete(Client, C)}.
add_client(Client) ->
S = some_state(),
C = S#state.clients,
S#state{clients = [Client|C]}.
get_clients(#state{clients = C, dbname = _D}) ->
C.
Run Code Online (Sandbox Code Playgroud)
测试:
1> reclist:empty_state().
{state,[],undefined}
2> reclist:some_state().
{state,[1,2,3],"QA"}
3> reclist:add_client(4).
{state,[4,1,2,3],"QA"}
4> reclist:del_client(2).
{state,[1,3],"QA"}
Run Code Online (Sandbox Code Playgroud)
::[pos_integer()]表示字段的类型是正整数值列表,从1; 开始; dialyzer当它执行类型检查时,它是分析工具的提示.
Erlang还允许您在记录上使用模式匹配:
5> reclist:get_clients(reclist:some_state()).
[1,2,3]
Run Code Online (Sandbox Code Playgroud)
进一步阅读:
@JUST MY正确的OPINION 回答让我记得我喜欢Haskell如何获取数据类型中字段的值.
这是一个数据类型的定义,从Learn You a Haskell for Great Good中偷走了!,它利用记录语法:
data Car = Car {company :: String
,model :: String
,year :: Int
} deriving (Show)
Run Code Online (Sandbox Code Playgroud)
它创建函数company,model以及year数据类型中的查找字段.我们先制作一辆新车:
ghci> Car "Toyota" "Supra" 2005
Car {company = "Toyota", model = "Supra", year = 2005}
Run Code Online (Sandbox Code Playgroud)
或者,使用记录语法(字段的顺序无关紧要):
ghci> Car {model = "Supra", year = 2005, company = "Toyota"}
Car {company = "Toyota", model = "Supra", year = 2005}
ghci> let supra = Car {model = "Supra", year = 2005, company = "Toyota"}
ghci> year supra
2005
Run Code Online (Sandbox Code Playgroud)
我们甚至可以使用模式匹配:
ghci> let (Car {company = c, model = m, year = y}) = supra
ghci> "This " ++ c ++ " " ++ m ++ " was made in " ++ show y
"This Toyota Supra was made in 2005"
Run Code Online (Sandbox Code Playgroud)
我记得曾尝试在Erlang中实现类似于Haskell的记录语法,但不确定它们是否成功.
一些关于这些尝试的帖子:
看来,LFE使用宏,这是类似于提供方案(球拍,例如),当你想创造一些结构的新的价值:
> (define-struct car (company model year))
> (define supra (make-car "Toyota" "Supra" 2005))
> (car-model supra)
"Supra"
Run Code Online (Sandbox Code Playgroud)
我希望将来我们会有一些接近Haskell记录语法的东西,这实际上非常实用且方便.