【发布时间】:2011-04-14 09:17:04
【问题描述】:
假设您有以下类型的 Erlang 歌曲记录:
rd(song, {artist, title, album}).
Song = #song{artist = <<"oasis">>, title = <<"wonderwall">>, album = <<"morning glory">>}.
但您想重新格式化歌曲记录以仅包含艺术家和标题。您将如何删除 Erlang 记录(在本例中为专辑)中的字段?
【问题讨论】:
假设您有以下类型的 Erlang 歌曲记录:
rd(song, {artist, title, album}).
Song = #song{artist = <<"oasis">>, title = <<"wonderwall">>, album = <<"morning glory">>}.
但您想重新格式化歌曲记录以仅包含艺术家和标题。您将如何删除 Erlang 记录(在本例中为专辑)中的字段?
【问题讨论】:
如果你真的,真的想从现有的记录元组中删除一个字段,这是可能的。
您可以使用tuple_to_list 和list_to_tuple 函数,也许还可以使用#song.title 语法来获取字段的索引,将其从列表中删除并转换回元组。
但这可能不是一个好主意。
【讨论】:
在某种意义上你不能,因为记录都是在编译时完成的,所以它们并不真正存在。你是#song 记录成为元组{song,Artist,Title,Album}。它是这样定义的。见Erlang -- Records。您需要做的是定义一个新的#song 记录并手动转换所有歌曲,即创建新的元组。请记住,所有数据都是不可变的。
有许多建议可以实现更动态的字段对象,但尚未被接受。
阅读 Erlang 文档,它通常是相当不错的。
【讨论】:
[{artist, "Queen"}, {song, "We Will Rock You"}, {album, "News Of The World"}]
orddict 的行为与 proplist 的行为非常相似。不要为此使用dict,因为空字典的开销更大,而且每首歌曲可能没有那么多数据。那么问题是如何存储所有歌曲的数据以及如何索引它们。对于这个dict 是合理的,或者是一个ets 表。