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

时间:2011-07-27 18:59:21

标签: erlang record tuples

是的,如果我有记录

-record(one, {frag, left}).
  • record_info(fields, one) 总是返回[frag, left]
  • tl(tuple_to_list(#one{frag = "Frag", left = "Left"})) 总是["Frag", "Left"]

这是一个实施细节吗? 非常感谢!

3 个答案:

答案 0 :(得分:2)

简短的回答是:是的,截至撰写本文时,它将起作用。更好的答案是:将来可能不会那样,问题的本质就是我。

使用record_info/2是安全的,虽然依赖订单可能有风险,坦率地说,我无法想到这样做的情况,这意味着你以错误的方式解决问题。您能否分享更多关于您要完成的内容的详细信息,以便我们帮助您选择更好的方法?可能只需要简单的模式匹配。

关于tuple_to_list/1的例子,我将引用Cesarini和Thompson的“Erlang Programming”:

  

“......无论你做什么,永远不要在你的程序中使用记录的元组表示。如果你这样做,本书的作者会否认你并拒绝参与帮助你学习Erlang。”

有几个很好的理由,包括:

  1. 您的代码将变得脆弱 - 如果您稍后更改字段数量或其顺序,您的代码将会中断。
  2. 无法保证记录的内部表示在未来版本的erlang中继续以这种方式工作。

答案 1 :(得分:1)

是的,在这两种情况下,Erlang都会保留“原始”订单。是的它是实现,因为它没有在功能规范或文档中特别说明,虽然它是一个非常安全的赌注,它将保持这样。

答案 2 :(得分:1)

是的,订单始终是相同的,因为由元组表示的记录是哪个订单是必不可少的属性。另请参阅我关于记录的其他答案:Syntax Error while accessing a field in a record