I due in realtà non hanno nulla a che fare con l'altro. In particolare, #==
è l'operatore di uguaglianza e #===
non ha assolutamente nulla con l'uguaglianza. Personalmente, trovo piuttosto spiacevole che #===
sembra così simile a #==
, usa il segno uguale e viene spesso chiamata la caso uguaglianza, eguali triple operatore o threequals operatore quando non ha davvero nulla a che fare con l'uguaglianza.
Io chiamo #===
il caso di sussunzione operatore (è il migliore che ho potuto inventare, sono aperto a suggerimenti, specialmente da madrelingua inglese).
Il modo migliore per descrivere a === b
è "se ho un cassetto con l'etichetta a
, ha senso mettere b
in esso?"
Quindi, ad esempio, Module#===
verifica se b.is_a?(a)
. Se hai Integer === 2
, ha senso inserire 2
in una casella con etichetta Integer
? Sì, lo fa. Che mi dici di Integer === 'hello'
? Ovviamente no.
Un altro esempio è Regexp#===
. Verifica una partita. Ha senso inserire 'hello'
in una casella con etichetta /el+/
? Sì, lo fa.
Per le raccolte come catene, Range#===
è definito come un test di appartenenza: ha senso mettere un elemento in una casella con una collezione se tale elemento è nella collezione.
Quindi, questo è ciò che fa #===
: verifica se l'argomento può essere riassunto sotto il destinatario.
Cosa deve fare questo con le espressioni case
? Semplice:
case foo
when bar
baz
end
è lo stesso di
if bar === foo
baz
end
fonte
2010-08-06 09:04:49
Penso che la migliore risposta qui http://stackoverflow.com/a/4467823/5048945 –