【问题标题】:Why use HashDict over Dict?为什么使用 HashDict 而不是 Dict?
【发布时间】:2016-08-31 18:16:24
【问题描述】:

Elixir 新手在这里。这个问题会很简短!

我正在通过在线编程练习来学习 Elixir,并获得了关于最近提交的以下建议:

一般来说最好使用 Dict.foo 而不是 HashDict.foo 如果 可能的。 Dict 函数适用于各种字典,所以如果 您的代码更改,您将有更少的地方更新。

这让我意识到我不知道你什么时候应该应该使用 HashDict 而不是 Dict。一个人有什么特殊的美德?

【问题讨论】:

    标签: elixir


    【解决方案1】:

    HashDict 的 API 匹配 Dict 的 API,因为 HashDict 实现了 Dict.Behaviour。建议使用 Dict 的 API 而不是 HashDict 的,因为一般来说,针对接口而不是实现进行编码总是一个好主意,在这种情况下,Dict 是接口,而 HashDict 是该接口的实现。

    我也不确定 Sasa 关于性能的观点,这可能是一个问题,但我几乎 100% 确信,总的来说,您应该更关心如何使用字典,而不是您访问它的方式。

    【讨论】:

    • 好答案! HashDict 是 Dict.Behaviour 的具体实现。您正在使用的具体实现更有可能发生性能损失,而不是函数调度中的任何模块查找。使用 Dict,您可以更改正在使用的实现,而无需更改任何访问代码。
    【解决方案2】:

    我能想到的唯一用例是性能优化。 Dict 函数需要在运行时解析目标模块,然后将调用转发到该模块。直接调用HashDict 就克服了这一步。

    我确信在绝大多数情况下,这种差异并不重要。但是,如果您遇到每微秒都很重要的情况,并且您经常调用 Dict,则可以通过直接调用 HashDict 来获得一些速度。就个人而言,我会在这样做之前进行测量。

    长话短说,Dict 应该在 99,9999999% 的情况下为您服务 :-)

    【讨论】:

    • 非常有趣。出于某种原因,HashDict 概念在早期练习中被大力推动,所以我有点接受了。听起来我应该一直使用 Dict 代替(至少在我找到不这样做的实际理由之前!)
    • 可能在练习中使用了HashDict,避免新手使用HashDict.new创建dict时可能出现的混淆,但使用Dict来操作它。
    【解决方案3】:

    据我所知,现在您应该只使用MapDict is deprecatedHashDict 一样

    【讨论】:

      猜你喜欢
      • 2012-06-17
      • 2016-02-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-04-22
      • 2013-12-07
      • 1970-01-01
      相关资源
      最近更新 更多