Erlang:获取记录字段值
Erlang: getting record field values
我想知道 Erlang 中是否有类似于下面发布的内部函数,它会给我记录字段值而不是记录字段名称。
record_info(fields, RecordName).
Record
in record_info(fields, Record) -> [Field]
不能是变量,因为它必须在编译时固定。
如果需要动态处理键值结构中的元素,请使用maps。
Erlang 中的记录实际上是一个元组,它的第一个元素是记录的名称。编译完成后,记录将被视为一个元组。
如果你有这个记录定义:
-record(name, [field, anotherfield]).
然后您可以像这样定义该记录类型的值:
#name{ field = value1, anotherfield = value2 }.
然而,这在引擎盖下的实际表示是这样的:
{name, value1, value2}.
请注意,字段名称实际上已不在此处。
现在,如果您想要记录中每个字段的值列表,您可以使用 tuple_to_list
:
[name, value1, value2] = tuple_to_list(Record).
因此,正如 jj1bdx 指出的那样,如果您想要一个包含所有值的 ;
分隔字符串,您可以这样做:
string:join([lists:flatten(io_lib:format("~p", [T])) || T <- tl(tuple_to_list(Record))], ";").
最后一个代码片段是直接从 jj1bdx 窃取的。
我想知道 Erlang 中是否有类似于下面发布的内部函数,它会给我记录字段值而不是记录字段名称。
record_info(fields, RecordName).
Record
in record_info(fields, Record) -> [Field]
不能是变量,因为它必须在编译时固定。
如果需要动态处理键值结构中的元素,请使用maps。
Erlang 中的记录实际上是一个元组,它的第一个元素是记录的名称。编译完成后,记录将被视为一个元组。
如果你有这个记录定义:
-record(name, [field, anotherfield]).
然后您可以像这样定义该记录类型的值:
#name{ field = value1, anotherfield = value2 }.
然而,这在引擎盖下的实际表示是这样的:
{name, value1, value2}.
请注意,字段名称实际上已不在此处。
现在,如果您想要记录中每个字段的值列表,您可以使用 tuple_to_list
:
[name, value1, value2] = tuple_to_list(Record).
因此,正如 jj1bdx 指出的那样,如果您想要一个包含所有值的 ;
分隔字符串,您可以这样做:
string:join([lists:flatten(io_lib:format("~p", [T])) || T <- tl(tuple_to_list(Record))], ";").
最后一个代码片段是直接从 jj1bdx 窃取的。