erlang 使用类型比使用记录有什么优势吗?

ubby3x7f  于 2022-12-16  发布在  Erlang
关注(0)|答案(1)|浏览(86)

我想在应用程序中存储坐标。坐标由三个浮点组成:x,y和z。定义一个类型将它们组合在一起,还是定义一个记录,这是一个更好的实践?Erlang用户指南说,它们都在编译过程中被转换为元组表达式。一种方法比另一种方法有优势吗?

-type coordinate() :: {X, Y, Z}.

-record(coordinate, {x, y, z}).
eagi6jfj

eagi6jfj1#

我猜您的意思是record s与tuple s,因为-type不存在于编译代码中,它只用于类型检查(您也可以为记录创建类型)。
记录是以记录名为前缀的元组:

-record(coordinate, {x,y,z}).

#coordinate{1,2,3} == {coordinate,1,2,3}.

这个新元素的开销最小,但可能会对性能产生一些影响(它会使记录大一个字),但是如果您考虑进行这种优化,可以通过直接使用组件或用C/C++重写关键路径来进一步优化它。
另一方面,使用记录大大提高了易读性,并允许您使用默认初始化器。
我建议对任何有意义的结构化值使用记录作为顶级元组,对所有值使用类型:

-record(coordinate, {
  x = 0 :: number(),
  y = 0 :: number(),
  z = 0 :: number()
 }).
-type coordinate() :: #coordinate{}.

-opaque stack(ElementType) :: {Elements :: [ElementType], Size :: non_neg_integer()}.
-record(position, {
  coord = #coordinate{} :: coordinate(),
  stack = {[], 0} :: stack(term()),
  id = 0 :: non_neg_integer()
 }).
-type position() :: #position{stack :: stack(coordinate())}.

-export_type([coordinate/0, stack/1, position/0]).

相关问题