record_info和tuple_to_list在Erlang中是否返回相同的键顺序?

record_info和tuple_to_list在Erlang中是否返回相同的键顺序?,erlang,record,tuples,Erlang,Record,Tuples,也就是说,如果我有记录 -record(one, {frag, left}). 是记录信息字段,总是会返回[frag, 左]? 是tltuple_to_listone{frag=frag,left=left} 永远是[该死的,左边]? 这是一个实现细节吗? 非常感谢 是的,在这两种情况下,Erlang都将保留“原始”订单。是的,它是一个实现,因为它在函数规范或文档中没有特别提到,尽管它是一个相当安全的赌注,它将保持这种状态。简短的回答是:是的,在撰写本文时它将起作用。更好的答案是:将来可能不会

也就是说,如果我有记录

-record(one, {frag, left}).
是记录信息字段,总是会返回[frag, 左]? 是tltuple_to_listone{frag=frag,left=left} 永远是[该死的,左边]? 这是一个实现细节吗?
非常感谢

是的,在这两种情况下,Erlang都将保留“原始”订单。是的,它是一个实现,因为它在函数规范或文档中没有特别提到,尽管它是一个相当安全的赌注,它将保持这种状态。

简短的回答是:是的,在撰写本文时它将起作用。更好的答案是:将来可能不会这样,问题的性质与我有关

使用record_info/2是安全的,尽管依赖订单可能会有风险,坦率地说,我想不出这样做有什么意义,这意味着你在以错误的方式解决问题。你能分享更多关于你想要达到的目标的细节吗?这样我们可以帮助你选择更好的方法?可能您只需要简单的模式匹配

关于tuple_to_list/1的示例,我将引用Cesarini和Thompson的Erlang编程:

。。。无论您做什么,永远不要在程序中使用记录的元组表示。如果你这样做,这本书的作者将否认你,并否认任何参与帮助你学习二郎

原因有几个,包括:

您的代码将变得脆弱-如果以后更改字段的数量或顺序,您的代码将崩溃。 不能保证记录的内部表示在未来的erlang版本中会继续以这种方式工作。
是的,顺序总是一样的,因为由元组表示的记录顺序是元组的基本属性。再看看我关于记录的另一个答案和例子:

好吧,我正在编写一个REST服务,我需要能够在PropList和记录之间进行转换-在这种情况下,我只使用record_info/2和tuple_to_list/组合使用-因此更改顺序或添加和删除字段不会破坏代码,前提是在这两个功能之间保留字段顺序。也就是说,有没有更好的方法来实现这一点?你应该看看Ulf Wiger的动态创建记录,而不依赖于内部元组结构。我在某个地方读到,这将使编译器优化记录访问的能力短路,但我想这并不重要。Piqi Protobuff将二进制文件解析为预定义的记录。我曾经遇到过这样一种情况,我需要将protobuff格式转换成标准的内部格式。我做这件事的方式和问题中描述的完全一样,折叠实际上是我写的zip_折叠函数,同样的概念;e、 例如,列表:foldlfun my_parser,my_record{},列表:ziprecord_infofields,piqi_record,tltuple_to_listPiqiTuple。如果模块或mnesia选项卡未更新transform_表,则代码会中断,但这可以通过智能重新连接轻松处理。exprecs可能是一个更好的解决方案。我应该补充一点,只有当您更改记录定义时,代码才会中断,但我已经用完了字符。据我估计,这真的没那么麻烦。真正的挑战是Erlang是否更改记录的内部表示。