【问题标题】:Converting records to proplists (and back)将记录转换为 proplists(并返回)
【发布时间】:2011-04-15 04:24:08
【问题描述】:

我有一个基于 Mochiweb 和 Mnesia 的 Erlang webapp,它使用和发出 JSON。在 Mnesia 中存储记录是有意义的;但是 Mochiweb/Mochijson 需要 proplist 格式的数据。所以我最终得到了大量的样板代码:

-record(foobar, {name, value}).

record_to_proplist(Record)->  
  [{name, Record#foobar.name},  
   {value, Record#foobar.value}].  

proplist_to_record(Props)->  
  #foobar{name=proplists:get_value("name", Props),  
          value=proplists:get_value("value", Props)}.  

单个小记录很好,很多大记录很痛苦。任何人都可以提出一个解决所有这些样板代码的方法吗?我想我需要一些动态检查记录字段的方法;而且由于记录是一个编译时构造,我猜[假设有可能]这意味着通过宏注入代码..

谢谢!

【问题讨论】:

    标签: erlang


    【解决方案1】:

    使用 record_info(fields, foobar) 可以动态地做一些事情。然而,record_info 也是一个编译时构造,因此记录名称不能是变量,因此您需要为要转换的每条记录使用一个子句。

    【讨论】:

      【解决方案2】:

      您应该能够执行以下操作:

      -record(foobar, {name, value}).
      -record(foo, {other, fields, 'and', stuff}).
      
      record_to_proplist(#foobar{} = Rec) ->
        lists:zip(record_info(fields, foobar), tl(tuple_to_list(Rec)));
      record_to_proplist(#foo{} = Rec) ->
        lists:zip(record_info(fields, foo), tl(tuple_to_list(Rec))).
      

      等等

      (或者作为一个宏(虽然仍然创建一个函数,宏是 ?R2P(Rec, foobar) 的版本太丑了):

      -define(R2P(Record), record_to_proplist(#Record{} = Rec) ->
                 lists:zip(record_info(fields, Record), tl(tuple_to_list(Rec)))).
      
      ?R2P(foobar);
      ?R2P(foo).
      

      )

      【讨论】:

      • 很好,但我仍然需要为每条记录生成 record_to_proplist。认为正确的方法可能是代码生成这些东西。
      • 你可以用 "find . -name "*rl" -exec grep -- '-record(' {} \; | sed 's/-record(([ ^,]*),.*/\1/'" 并根据它自动生成文件。
      【解决方案3】:

      听起来 exprecs 就是你要找的东西:

      http://forum.trapexit.org/viewtopic.php?p=21790

      阅读描述:

      模块是一个解析变换 允许您导出记录。这 transform 为 实例化、检查和 修改记录,无需 引入编译时依赖 模块之间。

      看看这是否有帮助。

      【讨论】:

      • 将 DanialLuna 的另一个答案放在一起:lists:zip(league2:'#info-'(Rec), tl(tuple_to_list(Rec)))。
      • 链接已失效。请在以后将完整的答案内联。
      【解决方案4】:

      已接受答案中的链接早已失效。

      简短的回答是使用 Ulf Wiger 的表达式。

      exprecs 是uwiger/parse_trans 中的一个parse_transform

      有关其工作原理的文章存档在网络存档中:http://web.archive.org/web/20130729014934/http://forum.trapexit.org/viewtopic.php?p=21790

      【讨论】:

        猜你喜欢
        • 2017-05-14
        • 1970-01-01
        • 1970-01-01
        • 2020-09-24
        • 2018-01-21
        • 2013-10-12
        • 2013-03-04
        • 2018-06-16
        • 1970-01-01
        相关资源
        最近更新 更多