函数字符串=>在erlang中记录成员

时间:2017-04-13 17:02:19

标签: erlang records

我想知道如何定义函数,作为参数接受一个字符串并返回记录的成员。 例如,记录

-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};
...

不行,因为我想在其他功能中重复使用这种模式。

1 个答案:

答案 0 :(得分:2)

如果表现不是你最关心的问题:

string folder = System.IO.Path.GetFileNameWithoutExtension(FileUpload1.FileName);

            string path = Request.PhysicalApplicationPath + "/" + folder;
            if (!System.IO.Directory.Exists(path))
                System.IO.Directory.CreateDirectory(path);
            string server_path = Request.PhysicalApplicationPath + "/myfiles/";

            FileUpload1.SaveAs(server_path + FileUpload1.FileName);

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