Erlang记录项目列表

0xA*_*xAX 6 erlang list record

例如,我有erlang记录:

-record(state, {clients
            }).
Run Code Online (Sandbox Code Playgroud)

我可以从客户字段列表中制作吗?

我可以保留在正常列表中的客户端?如何在此列表中添加一些值?

谢谢.

Yas*_*aev 7

也许你的意思是:

-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记录语法的东西,这实际上非常实用且方便.