函数字符串 => 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};
...

不好,因为我想在其他函数中重用这种模式。

如果性能不是你最关心的问题:

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作为编译时常量。

最新更新