【问题标题】:Is it ever a good idea to use association lists instead of records?使用关联列表而不是记录是个好主意吗?
【发布时间】:2016-01-19 15:52:53
【问题描述】:

有经验的 Erlang 程序员会推荐association lists 而不是记录吗?

一种情况可能是不同机器上的两个(或更多)节点正在交换消息。我们希望能够独立升级每台机器上的软件。一些升级可能涉及向一个(或多个)正在发送的消息添加一个字段。似乎使用记录作为消息意味着您必须始终在锁定步骤中对两台机器进行升级,以便额外的字段不会导致接收器忽略记录。然而,如果您使用关联列表之类的东西(它仍然具有“类似记录”的 API),尚未升级的接收器仍会成功接收消息,而忽略新字段。我意识到这不是 总是 想要的行为,但 经常 它是。此外,假设消息相当小,因此查找时间无关紧要。

假设以上有一定道理,我还有以下问题:

  • 是否有用于 alist 的标准(或广泛使用的)库?一些琐碎的谷歌搜索没有发现任何东西。
  • 在其他情况下您会使用关联列表(或类似的东西)吗?

【问题讨论】:

    标签: erlang


    【解决方案1】:

    你基本上有三个选择:

    1. 使用记录
    2. 使用关联列表(proplists)
    3. 使用组合

    我使用更改可能性非常低的记录。这样我就得到了我想要的模式匹配和加速。

    我在需要类似哈希表的功能时使用 proplist。我以牺牲模式匹配和速度为代价获得了灵活性。

    有时我会同时使用两者。具有一个字段的记录是 proplist。这样我就可以对其中的一部分进行模式匹配,并且在我需要的地方具有灵活性。

    所有三种选择都有不同的权衡取舍,因此您基本上只需评估您的特定需求并做出选择。可能需要进行一些原型设计和尝试才能确定哪些权衡是有意义的,以及您绝对必须具备哪些功能。

    【讨论】:

      【解决方案2】:

      对于少量的键,你可以使用列表又名proplists,对于更大的你应该使用dict。在这两种情况下,最大的缺点是您不能以用于记录的方式使用模式匹配。还有速度惩罚,但在大多数情况下是无关紧要的。

      【讨论】:

      • proplists 模块 +1。至于 dict 我真的没有太多需要它,但我想那是因为我尽量保持我的 proplists 尽可能小。
      【解决方案3】:

      请注意,lists:keysearch/3 几乎是“assq”。

      【讨论】:

        猜你喜欢
        • 2011-01-05
        • 2014-07-18
        • 1970-01-01
        • 2012-04-27
        • 1970-01-01
        • 2012-05-29
        • 2019-08-24
        • 1970-01-01
        • 2013-03-09
        相关资源
        最近更新 更多