2017-04-13 42 views
0

我想知道如何定義函數,它作爲參數需要一個字符串並返回記錄的成員。 例如與記錄函數字符串=>在erlang中記錄成員

-record(measurement, { temperature, pm2p5, pm10, pressure, humidity, others=[]}). 

而且我的函數的片段:

update_measurement(Measurement, Type_as_String, Value) -> 
    Measurement#measurement{get_type(Type_as_String) = Value} 

我想傳遞一個類型爲字符串更新值,我沒有一個想法來定義功能get_type(Type_as_String)。 我試過用原子,但它沒有工作。

喜歡的東西

update_measurement(Measurement, Type_as_String, Value) -> 
    case Type_as_String of 
     "temperature" -> Measurement#measurement{temperature = Value}; 
     "humidity" -> Measurement#measurement{humidity = Value}; 
... 

也不行,因爲我想重用在其他功能上這種模式。

+0

你的意思是'binary_to_atom'?但事實上,這似乎有點奇怪,難道你不能只寫所有的匹配器嗎? – raina77ow

+0

不,我定義了'get_type(Type_as_String) - > 「溫度」 - >溫度; 「溼度」 - >溼度; ....「但沒有工作 – przem

+0

對不起,不明白:是你的字符串是二進制還是列表?如果後者('「溫度」'),則使用'list_to_atom/1'代替。像'list_to_atom(「溫度」)=>溫度。 – raina77ow

回答

2

如果性能是不是你最大的擔憂:

update_measurement(Measurement, Type_as_String, Value) -> 
    update_field(Measurement, Type_as_String, Value). 

update_field(#measurement{} = Record, SKey, Value) -> 
    update_field(Record, SKey, Value, record_info(fields, measurement)); 
% add other records here 
update_field(_, _, _) -> error(bad_record). 

update_field(Record, SKey, Value, Fields) -> 
    update_field(Record, list_to_existing_atom(SKey), Value, Fields, 2). 

update_field(Record, Key, Value, [Key|_], N) -> 
    setelement(N, Record, Value); 
update_field(Record, Key, Value, [_|Fields], N) -> 
    update_field(Record, Key, Value, Fields, N+1); 
update_field(_, _, _, [], _) -> 
    error(bad_key). 

注意record_info/2是不是一個真正的功能,但你必須提供measurement作爲一個編譯時間常數。

相關問題