我想知道如何定义函数,它作为参数接受一个字符串并返回记录的成员。例如,与记录
-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};
...
不好,因为我想在其他函数中重用这种模式。
如果性能不是你最关心的问题:
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
作为编译时常量。