【发布时间】:2012-11-02 02:27:59
【问题描述】:
当修改是对我们以编程方式指定的字段时,是否有任何相对简单的方法来(复制和)修改 Erlang 中的记录?
例如:
-record(my_record, {foo = 0, bar = 0}).
modify_record(Record, Field, Value) ->
Record#my_record{Field = Value}.
这样人们就可以做类似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
我知道有一些关于如何转换为/从 proplist 转换的示例,但我希望得到更直接的东西。
【问题讨论】:
-
我以前也研究过这个问题。但是记录只是存在于编译时的元组。我希望有一些元编程技巧可以做到这一点。
-
对,这让我相信它应该是可行的,因为从原子到字段的映射是编译的。它必须为无效字段发出某种错误信号,但这是意料之中的无论如何。
-
不,它不可行。关于记录的一切都是在编译时制定的。你到底想做什么?你想怎么用这个。
-
我正在构建验证测试,我从有效记录开始并修改各个字段以测试验证代码。但这应该不重要吧?从字段名称的原子到记录中字段位置的映射在运行时是已知的,因此使用@Odobenus 建议的方法似乎应该是可行的。