【问题标题】:which one of == and =:= should I use?我应该使用 == 和 =:= 中的哪一个?
【发布时间】:2012-05-21 08:26:25
【问题描述】:

Difference between equal to and exactly equal to term comparison operators 解释了差异,但还有一个重要问题:当我不将浮点数与其他东西进行比较时,我应该使用哪一个?

“Pragmatic Programming Erlang”推荐 =:= 并说你应该对 == 保持怀疑,并且只在处理浮点数时使用它。但是它也说很多现有的代码不遵循这个规则。

所以我有点进退两难。我是否应该使用“==”(即使将浮点数与其他值进行比较)以与周围的代码保持一致?我是否应该酌情使用“=:=”,即使这与文件的其余部分不一致?我应该将文件中的其他表达式转换为使用“=:=”吗?

什么是权衡?任何一个操作员都比另一个更有效吗?如果保证其中一个操作数不是数字,那么我使用哪一个有关系吗?是否没有隐藏的陷阱(例如,特殊的浮点值,如 NaN、Inf 等。如果 Erlang 支持这些)。

顺便说一句,我面临的代码库是 ejabberd。

【问题讨论】:

    标签: performance coding-style erlang


    【解决方案1】:

    如果您不需要比较整数和浮点数,请使用 =:=。性能是相同的(或者至少差异太小而无法衡量)并且在 Erlang 中不存在 NaN、inf 等。

    很多 OTP 库代码使用 == 的原因可能是因为 =:= 是 Erlang 中最近添加的。

    【讨论】:

    • 好吧,=:= 在“Erlang 中的并发编程”的第一版(1993 年)第 30 页中进行了描述。如果这对您来说是最近的,那么您可能已经比我更久了。:- )
    • 无论如何,是的,通常应该使用 =:=,因为它与模式匹配中的相等性测试相同。在不需要算术相等时使用 == 可能会引入细微的错误,并且还会强制 Dialyzer 假设数据可能是浮点数,即使您知道它应该只是整数。
    猜你喜欢
    • 1970-01-01
    • 2013-04-11
    • 2014-12-21
    • 2013-07-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-09-28
    • 2015-12-05
    相关资源
    最近更新 更多