3 è uguale o operatore di uguaglianza Caso
-
13-10-2019 - |
Domanda
In Ruby torna Integer === 5
true
. Allo stesso modo i rendimenti String === "karthik"
true
.
Tuttavia, 5 === Integer
ritorna false
. E "karthik" === String
.
Perché l'operatore non commutativa?
Soluzione
La risposta è semplice: perché non ha senso. Il rapporto descrive l'operatore non è commutativa, perché dovrebbe essere l'operatore?
Basta guardare i tuoi esempi: 5
è un Integer
. Ma è un Integer
5
? Che cosa significa che anche media
===
è il operatore caso sussunzione , e sussunzione non significa pendolari.
Il fatto che gli usi operatore caso sussunzione uguale segni, e che di solito è chiamato il eguali triple , threequals
o case equality
dell'operatore è terribilmente sfortunato dato che ha non solo assolutamente nulla a che fare con l'uguaglianza, ma anche non è conforme a molte delle leggi che si conforma a parità, come la transitività e come lei ha ricordato commutativa.
Per maggiori della mia sproloqui su ===
vedi
Altri suggerimenti
Una ragione molto semplice è che il rapporto is_a?
per le classi non può essere solo commutativa. Si consideri il caso in cui entrambi gli operandi sono classi:
Class === String
Questo restituirà true perché String.is_a?(Class)
. Tuttavia String === Class
restituirà falso, perché Class.is_a?(String)
è falsa e che è, naturalmente, come dovrebbe essere.
Un altro motivo è che la semantica della ===
dipende dal suo operando sinistro. Questo ha di nuovo due ragioni: a) nei rubino la semantica dipendono sempre l'operando a sinistra, perché l'operando sinistro è il destinatario della chiamata metodo e b) è utile, in modo da poter utilizzare per esempio classi, gamme e regexen in una dichiarazione caso con la semantica destinati.
Molti operatori non sono commutativa.
Il ===
si chiama "operatore caso uguaglianza", perché viene chiamato quando ramificazione è un caso.
E 'bello e utile che:
foo = 42
case foo
when Integer
# branches here
when String
# etc...
end
Non sarebbe molto utile se
foo = Integer
case foo
when 42
# would branch here??
when 666
# etc...
end
Si noti che in Ruby 1.9, l'operatore ===
su un Proc / lambda chiamerà che Proc:
divisible_by_three = ->(x){x % 3 == 0}
divisible_by_three === 42 # => true
Anche in questo caso, molto utile in una dichiarazione case
, ma non molto in ordine inverso.
di cui ha bisogno per implementare caso in cui il confronto
E 'normale avere operatori non commutativa.
/ - % [] . -> ^ << >> < <= > >= && || = += -= ,
E come spesso accade, ===
esiste in parte come il caso quando l'operatore . Questo è piuttosto complesso in Ruby, e non poteva essere così, se doveva essere semplificato per un op commutativa.