2012-05-21 22 views
6

Difference between equal to and exactly equal to term comparison operators spiega la differenza, ma una domanda importante è anche: quale dovrei usare, quando non paragono i float ad altre cose?quale di == e =: = dovrei usare?

"Pragmatic Programming Erlang" raccomanda =: = e dice che dovresti essere sospettoso riguardo == e usarlo solo quando si tratta di float. Tuttavia dice anche che un sacco di codice esistente non segue questa regola.

Quindi ho un piccolo dilemma. Dovrei usare "==" (anche quando non confrontando i float con altri valori) per coerenza con il codice circostante? Dovrei usare "=: =" come appropriato, anche se questo sarebbe incoerente con il resto del file? Devo convertire le altre espressioni nel file per usare "=: ="?

Quali sono i compromessi? L'operatore è più efficiente dell'altro? Se uno degli operandi è garantito per non essere un numero, è importante quale uso? Non ci sono trappole nascoste (diciamo, wrt, valori float speciali come NaN, Inf, ecc. - nel caso in cui Erlang supporti questi).

BTW, il codebase che sto affrontando è ejabberd.

risposta

5

Utilizzare =: = se non è necessario confrontare gli oggetti con i galleggianti. La performance è la stessa (o almeno la differenza è troppo piccola per essere misurata) e NaN, inf ecc non esistono in Erlang.

Il motivo per cui un sacco di codice libreria OTP utilizzato == è probabilmente perché =: = è un'aggiunta piuttosto recente a Erlang.

+2

Bene, =: = è descritto nella prima edizione (1993) di "Concurrent Programming in Erlang", pagina 30. Se è recente per te, potresti essere stato più lungo di me :-) – RichardC

+1

In ogni caso, sì , di solito si dovrebbe usare =: =, perché è lo stesso test di uguaglianza che viene fatto nella corrispondenza del modello. Usare == quando non si ha bisogno dell'uguaglianza aritmetica può introdurre bug sottili, e può anche forzare Dialyzer ad assumere che i dati possano essere float anche se si sa che dovrebbero essere solo numeri interi. – RichardC