通过以编程方式指定要修改的字段来修改Erlang中的记录

dan*_*ain 3 erlang record

当修改是我们以编程方式指定的字段时,是否有任何相对简单的方法(复制和)修改Erlang中的记录?

例如:

-record(my_record, {foo = 0, bar = 0}).

modify_record(Record, Field, Value) ->
  Record#my_record{Field = Value}.
Run Code Online (Sandbox Code Playgroud)

所以,人们可以做类似的事情modify_record(#my_record{foo = 1}, bar, 42),或者,modify_record(some_method_that_returns_a_my_record(), foo, 3.14)

编译类似的东西,我得到错误

field 'Field' is not an atom or _ in record my_record
Run Code Online (Sandbox Code Playgroud)

我意识到有一些关于如何转换到/来自一个名单的例子,但我希望有更直接的东西.

Odo*_*rus 5

如果您传递字段编号(而不是字段名称),则可以.意味着你称之为功能

modify_record(MyRecord, #my_record.foo, 3.14)
Run Code Online (Sandbox Code Playgroud)

代替

modify_record(MyRecord, foo, 3.14)
Run Code Online (Sandbox Code Playgroud)

(#my_record.foo返回记录中foo字段的数量).在这种情况下,您的修改记录可能是

  modify_record(R, FieldNo, Val) -> setelement(FieldNo,R,Val).
Run Code Online (Sandbox Code Playgroud)