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?

È stato utile?

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.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top