Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ssl/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何将项目列表映射到Erlang记录_Erlang - Fatal编程技术网

如何将项目列表映射到Erlang记录

如何将项目列表映射到Erlang记录,erlang,Erlang,二郎初学者在这里 我有一个元素列表,其中我想将一些元素映射到带有记录的项 List = ["a", "b", "c", "d", "e"]. 我还有一个记录,定义如下: -record(a_record, { itemA = "", itemB = ""}). 我想将列表映射到一个与记录定义匹配的元组中,以便最终得到: #a_record{itemA="A", itemB="B" }. 我正在查看列表模块,但还没有找到一个干净的解决方案 谢谢你的帮助 您可以使用记录信息/2和列表到元组/1

二郎初学者在这里

我有一个元素列表,其中我想将一些元素映射到带有记录的项

List = ["a", "b", "c", "d", "e"].
我还有一个记录,定义如下:

-record(a_record, { itemA = "", itemB = ""}).
我想将列表映射到一个与记录定义匹配的元组中,以便最终得到:

#a_record{itemA="A", itemB="B" }.
我正在查看列表模块,但还没有找到一个干净的解决方案


谢谢你的帮助

您可以使用记录信息/2和列表到元组/1:

   List = ["a", "b", "c", "d", "e"],
   List2 = [string:to_upper(P) || P <- lists:sublist(List, record_info(size, a_record)-1)],
   list_to_tuple([a_record | List2]).
List=[“a”、“b”、“c”、“d”、“e”],

List2=[字符串:到上(P)| | P

如果您可以保证列表中的元素与要初始化的记录字段的顺序相同,并且列表中的元素数至少与记录中的字段数相同,那么您可以通过利用记录是下元组这一事实,应用一些技巧从列表中创建记录的实例封面。例如,您的

a_记录
表示为一个元组,其第一个元素是atom
a_记录
,后跟两个元素,每个记录字段一个

1> List = ["a", "b", "c", "d", "e"].
["a","b","c","d","e"]
2> rd(a_record, { itemA = "", itemB = ""}).
a_record
3> ARecord = list_to_tuple([a_record|lists:sublist(List,size(#a_record{})-1)]).
#a_record{itemA = "a",itemB = "b"}

命令1定义了我们的
列表
,在命令2中,我们使用shell
rd
命令定义了一个与您问题中的记录类似的记录。命令3构建了一个新的列表,该列表由记录名作为头,字段初始值设定项作为尾组成。
size/1
函数为我们提供了记录中包含它的字段数s name,因此我们从中减去1,并使用结果值作为
List
子列表的大小,用于初始化记录字段。然后,我们将结果列表传递给
List\u to\u tuple/1
,如您所见,结果是一个
a\u记录
实例,该实例使用
List
中的值初始化'更安全的做法是理解列表并从映射中实际检索与记录中的字段关联的键。您可能会得到一个充满未定义字段的记录,但不需要进行任何检查以确保映射的键/值数与记录的键/值数相同,也不需要考虑任何顺序


记录类型=一条记录。
RecordFields=记录信息(字段,记录)。
Map=#{a_记录_字段=>}。
记录=映射到记录(映射、记录类型、记录字段)。
映射到记录(映射、记录类型、记录字段)->

RecordValues=[映射:获取(记录字段,映射,未定义)| | RecordField还需要注意的是,虽然这在技术上是这样做的,但最好是通过对字段进行硬编码并从列表中获取每个值来手动执行。这样,当记录长度或字段顺序发生更改时,您不会最终创建无效记录。@AdamLindberg您的建议对我来说似乎是一种安全的方法嗯,当你说手动的时候,你是指使用列表之类的东西:NTH把每一个项目从列表中拉出来,然后建立这些记录?@ Brangn:另一件事:虽然记录和地图是不可互换的,但是你可以考虑一个地图是否适合你的用例,如果是这样的话,请注意,你需要一个K的列表。在这种情况下,ey值对。@BrianB,manually是smth类似于
[A,B |!]=List,#A![u]记录{itemA=A,itemB=B}