2012-05-21 2 views
6

Difference between equal to and exactly equal to term comparison operators erklärt den Unterschied, aber eine wichtige Frage ist auch: Welche sollte ich verwenden, wenn ich Floats nicht mit anderen Dingen vergleiche?welche von == und =: = soll ich verwenden?

"Pragmatische Programmierung Erlang" empfiehlt =: = und sagt, dass Sie gegenüber == misstrauisch sein sollten und es nur im Umgang mit Floats verwenden sollten. Es besagt aber auch, dass viel bestehender Code dieser Regel nicht folgt.

Also habe ich ein kleines Dilemma. Sollte ich "==" (auch wenn nicht floats mit anderen Werten vergleicht) für die Konsistenz mit dem umgebenden Code verwenden? Sollte ich "=: =" als geeignet verwenden, auch wenn dies nicht mit dem Rest der Datei übereinstimmt? Sollte ich die anderen Ausdrücke in der Datei konvertieren, um "=: =" zu verwenden?

Was sind die Kompromisse? Ist einer der beiden Betreiber effizienter als der andere? Wenn einer der Operanden garantiert keine Zahl ist, spielt es dann eine Rolle, welche ich verwende? Gibt es keine versteckten Traps (sagen wir mal, spezielle Float-Werte wie NaN, Inf, etc .. - falls Erlang dies unterstützt).

Übrigens ist die Codebasis, mit der ich konfrontiert bin, ejabberd.

Antwort

5

Verwenden Sie =: = wenn Sie Ints nicht mit Floats vergleichen müssen. Die Leistung ist die gleiche (oder zumindest der Unterschied ist zu klein zum Messen) und NaN, inf usw. existieren in Erlang nicht.

Der Grund, warum eine Menge OTP-Bibliothekscode verwendet = = ist wahrscheinlich, weil =: = ist eine ziemlich neue Ergänzung zu Erlang.

+2

Nun, =: = wird in der ersten Ausgabe (1993) von "Concurrent Programming in Erlang", Seite 30 beschrieben. Wenn das für Sie neu ist, sind Sie vielleicht länger als ich. :-) – RichardC

+1

Wie auch immer, ja , sollte man normalerweise =: = verwenden, weil es der gleiche Gleichheitstest ist, der beim Mustervergleich durchgeführt wird. Die Verwendung von ==, wenn Sie keine arithmetische Gleichheit benötigen, kann zu subtilen Fehlern führen und kann auch dazu führen, dass Dialyzer davon ausgeht, dass die Daten Floats sein könnten, obwohl Sie wissen, dass es nur ganze Zahlen sein sollte. – RichardC