2010-09-19 83 views
4
刪除字段

假設你有以下類型的歌曲一個Erlang紀錄:二郎:在記錄

rd(song, {artist, title, album}). 
Song = #song{artist = <<"oasis">>, title = <<"wonderwall">>, album = <<"morning glory">>}. 

但是你要重新格式化的歌曲記錄只包含藝術家和標題。你將如何去除Erlang記錄中的字段(在這個例子中是專輯)?

回答

6

從某種意義上說,你不能在記錄全部在編譯時完成,所以它們並不真實存在。你是#song記錄變成了元組{song,Artist,Title,Album}。它是這樣定義的。見Erlang -- Records。你需要做的是定義一個新的#song記錄並手動轉換所有歌曲,即創建新的元組。記住所有數據都是不可變的。

已經有很多建議來實現更動態的字段對象,但是還沒有被接受。

閱讀Erlang文檔,它通常相當不錯。

+1

你覺得有序的詞典更合適嗎? – 2010-09-19 20:03:04

+1

如果您正在使用proplists處理少量元素,應該非常高效。 Proplists是這樣的2元組元素列表:'[{artist,「Queen」},{song,「We Will Rock You」},{專輯,「世界新聞報」}]' – gleber 2010-09-20 05:32:24

+0

proplist將罰款爲每首歌曲的數據。這會慢一點,但會更加動態。使用有序字典或任何其他形式的字典也是如此。對於你正在做的事情,'orddict'的行爲與'proplist'大致相同。不要使用'dict',因爲空字典的開銷較大,並且每首歌曲的數據可能不會太多。現在的問題是如何存儲所有歌曲的數據以及如何爲它們編制索引。因爲這個「dict」是合理的,或者是ets表。 – rvirding 2010-09-23 15:17:00

0

如果你確實真的想從現有記錄元組中實際刪除一個字段,那麼這是可能的。

您可以使用tuple_to_listlist_to_tuple函數,也可以使用#song.title語法來獲取字段的索引,將其從列表中移除並轉換回元組。

但這可能不是一個好主意。