Les deux n'ont rien à voir les uns avec les autres. En particulier, #==
est l'opérateur d'égalité et d' #===
a absolument rien à égalité. Personnellement, je trouve ça plutôt dommage qu' #===
semble si proche de #==
, utilise le signe égal et est souvent appelé le cas opérateur d'égalité, triple égal à l'opérateur ou threequals opérateur lorsqu'il n'a vraiment rien à voir avec l'égalité.
J'appelle #===
le cas subsomption de l'opérateur (c'est le mieux que je pouvais venir, je suis ouvert aux suggestions, en particulier de langue maternelle anglaise).
La meilleure façon de décrire a === b
"si j'ai un tiroir étiqueté a
, est-il judicieux de mettre b
- t-il?"
Ainsi, par exemple, Module#===
tests s' b.is_a?(a)
. Si vous avez Integer === 2
, est-il judicieux de mettre 2
dans une boîte étiquetée Integer
? Oui, c'est fait. Qu'en Integer === 'hello'
? Évidemment pas.
Un autre exemple est - Regexp#===
. Il teste pour un match. Est-il judicieux de mettre 'hello'
dans une boîte étiquetée /el+/
? Oui, c'est fait.
Pour les collections tels que les plages, Range#===
est définie comme une adhésion à l'essai: il a un sens pour mettre un élément dans une case avec une collection si l'élément est dans la collection.
Donc c'est ce qu' #===
: il teste si l'argument peut être subsumé sous le récepteur.
Quel est le avec case
expressions? Simple:
case foo
when bar
baz
end
est le même que
if bar === foo
baz
end