2010-06-04 75 views
2

我想從屬性列表創建記錄 - 不是實際的列表,而是例如#xmlElement屬性。我有我需要處理的元素列表以及可能的屬性列表。當然從屬性列表創建記錄

我可以這樣做:

create_record(Rec, [{attr1, Val}|As]) -> create_record(Rec#blah{attr1 = Val}, As); 
create_record(Rec, [{attr2, Val}|As]) -> create_record(Rec#blah{attr2 = Val}, As); 
... 

但是,這將是一個比較長,我已經有可能的屬性列表(我甚至可以用record_info(fields, blah)我看到了很多瘋狂的方式。與訪問與setelement實際記錄的元組做,但也許有一個簡單的解決方案

回答

2

我可能是最被誘惑?

create_record(Lst) -> 
    #blah{ 
     attr1=proplists:get_value(attr1, Lst, default_attr1), 
     attr2=proplists:get_value(attr2, Lst, default_attr2), 
     ... 
    }. 

把這個東西轉換成記錄的觀點可能是在編譯時在你的代碼的其他地方對屬性進行靜態檢查,所以我認爲這裏沒有任何傷害,直接和重複一點。

如果您確實需要,record_info魔術非常簡單,但請記住record_info不是真正的函數,因此此函數不能是通用的。 (宏可能。)

make_record(Lst) -> 
    list_to_tuple([blah|[proplists:get_value(X, Lst) || X <- record_info(fields, blah)]]). 

如果你真的想在運行時動態密鑰,然後用字典。

3

這聽起來像exprecs是你在找什麼:

http://forum.trapexit.org/viewtopic.php?p=21790

從描述閱讀:

該模塊是解析變換 讓您導出記錄。 變換爲 實例化,檢查和 添加訪問器函數,而不必 在模塊之間引入編譯時相關性 。

看看這是否有幫助。