Erlang 公共api中的记录与标记元组

Erlang 公共api中的记录与标记元组,erlang,Erlang,从查询函数返回记录是常见的做法吗?如果没有,那么缺点是什么 假设我有一个查询服务,可以返回一些汽车,以及它们是否是当前租用的 我的汽车记录如下: -type rent_state:: rented | available. -record(car, {make::string(), year::integer(), color::string(), state::rent_state()}). 如果我有一个关于汽车的查询,那么返回这个记录是合理的吗 -type car::#car{}. -sp

从查询函数返回记录是常见的做法吗?如果没有,那么缺点是什么

假设我有一个查询服务,可以返回一些汽车,以及它们是否是当前租用的

我的汽车记录如下:

-type rent_state:: rented | available.
-record(car, {make::string(), year::integer(), color::string(), state::rent_state()}).
如果我有一个关于汽车的查询,那么返回这个记录是合理的吗

-type car::#car{}.
-spec cars() -> [car()].
或者我应该创建一个标记的元组类型

-type car()::{ {make, string()}, {year,integer()}, {color,string()}, {state,rent_state()}}).

我想制作一个易于他人使用的API。非常感谢您的建议。

我喜欢在模块中本地使用记录,但我发现在应用程序之间共享这些记录存在一些缺点:

  • 把它们装进REPL有点痛苦
  • 记录定义是全局性的,所以你可能想把你的记录命名为drozzy_vehicles_car或者其他长的名字,然后使用它会很难看
  • 库的用户必须包含定义记录的头文件,否则它将无法工作
您描述的标记元组似乎是一个很难处理的问题——没有简单的方法可以从中间抓住一些东西

如果你懒惰,我会使用地图;如果你不懒惰,我会使用访问者

地图:

访问者:

1> Car = rentals:get_car().
{car,"foo",2016,"red",rented}  %% it's actually a record, but we don't expose that!
2> rentals_car:year(Car).
2016
3> rentals_car:state(Car).
rented
4> % etc

也。在处理请求和使用记录时,向应答添加数据并升级系统时,您必须首先加载调用模块,并使该模块的新版本同时处理记录的旧版本(现在是标记元组)和新版本,因为您不知道调用的查询服务模块的版本。
1> Car = rentals:get_car().
{car,"foo",2016,"red",rented}  %% it's actually a record, but we don't expose that!
2> rentals_car:year(Car).
2016
3> rentals_car:state(Car).
rented
4> % etc