Erlang:删除记录中的字段

Erlang:删除记录中的字段,erlang,records,Erlang,Records,假设您有以下类型的Erlang歌曲唱片: rd(song, {artist, title, album}). Song = #song{artist = <<"oasis">>, title = <<"wonderwall">>, album = <<"morning glory">>}. rd(歌曲,{艺术家,标题,专辑})。 歌曲=#歌曲{艺术家=,标题=,专辑=}。 但您希望重新格式化歌曲记录,使其仅包含艺术家和标

假设您有以下类型的Erlang歌曲唱片:

rd(song, {artist, title, album}).
Song = #song{artist = <<"oasis">>, title = <<"wonderwall">>, album = <<"morning glory">>}.
rd(歌曲,{艺术家,标题,专辑})。
歌曲=#歌曲{艺术家=,标题=,专辑=}。

但您希望重新格式化歌曲记录,使其仅包含艺术家和标题。您如何删除Erlang记录(在本例中为album)中的字段?

从某种意义上说,您无法删除,因为记录都是在编译时完成的,所以它们实际上并不存在。你是
#歌曲
记录成为元组
{歌曲、艺术家、标题、专辑}
。它的定义是这样的。看见您需要做的是定义一个新的
#歌曲
录制并手动转换所有歌曲,即创建新元组。记住,所有数据都是不可变的

对于实现更具动态性的field对象,有很多建议,但都没有被接受


阅读Erlang文档,它通常非常好。

如果您真的真的想从现有记录元组中删除字段,这是可能的

您可以使用
tuple\u to\u list
list\u to tuple
函数,也可以使用
#song.title
语法获取字段索引,将其从列表中删除并转换回tuple


但这可能不是一个好主意。

您认为有序字典更合适吗?如果您使用PropList处理少量元素,应该会非常有效。proplist是这样的2元素元组列表:
[{artist,“Queen”},{song,“We Will Rock You”},{album,“News of The World”}]
对于每首歌曲的数据,proplist是合适的。它会稍微慢一点,但会更有活力。使用有序词典或任何其他形式的词典也是如此
orddict
的行为与
proplist
的行为基本相同。不要为此使用
dict
,因为空dict的开销更大,而且您可能不会为每首歌曲提供那么多数据。接下来的问题是如何存储所有歌曲的数据以及如何对它们进行索引。因此,
dict
是合理的,或者是ets表格。