Que fait l’opérateur “===” dans Ruby?

Duplication possible:
=== vs == en Ruby

Je l’ai vu utilisé plusieurs fois ces derniers temps mais je n’arrive pas à comprendre ce qu’il fait. Quelqu’un peut-il illustrer comment cela fonctionne?

Tout comme avec toutes les autres méthodes de Ruby (ou pratiquement tout langage orienté object),

 a === b 

signifie tout ce que l’auteur d’ a classe veut dire.

Cependant, si vous ne voulez pas confondre vos collègues, la convention est que === est l’opérateur de la subsomption de cas . Fondamentalement, c’est un opérateur booléen qui pose la question ” Si j’ai un tiroir étiqueté a serait-il logique de mettre b dans ce tiroir?

Une autre formulation est ” Si a décrit, serait un membre de cet ensemble?

Par exemple:

  (1..5) === 3 # => true (1..5) === 6 # => false Integer === 42 # => true Integer === 'fourtytwo' # => false /ell/ === 'Hello' # => true /ell/ === 'Foobar' # => false 

L’utilisation principale de l’opérateur === est dans les expressions de case , car

 case foo when bar baz when quux flurb else blarf end 

se traduit en quelque chose (grossièrement) comme

 _temp = foo if bar === _temp baz elsif quux === _temp flurb else blarf end 

Notez que si vous souhaitez rechercher cet opérateur, il est généralement appelé opérateur sortingple equals ou opérateur sortingple ou opérateur d’ égalité de cas . Je n’aime vraiment pas ces noms, car cet opérateur n’a absolument rien à voir avec l’égalité.

En particulier, on pourrait s’attendre à ce que l’égalité soit symésortingque: si a est égal à b , alors b vaut mieux être égal à a . En outre, on pourrait s’attendre à ce que l’égalité soit transitive: si a == b et b == c , alors a == c . Bien qu’il n’y ait aucun moyen de garantir réellement que dans un langage à dissortingbution unique comme Ruby, vous devriez au moins faire un effort pour préserver cette propriété (par exemple, en suivant le protocole de coerce ).

Cependant, pour === il n’y a aucune attente de symésortinge ou de transitivité. En fait, la conception n’est pas symésortingque. C’est pourquoi je n’aime pas l’appeler comme quoi, même de loin, ressemble à l’égalité. C’est aussi pourquoi je pense, cela aurait dû être appelé autre chose comme ~~~ ou autre.

Merci pour votre retouche Jacob, j’étais sur le sharepoint vous appeler;) Je vais poster quelques exemples de toute façon. L’implémentation de === diffère selon le type. Par exemple:

 (1...3) === 2 => true /test/ === "this is a test" => true case 'test' when /blah/ "Blach" when /test/ "Test" else "Fail" end => "Test" 

Stephen, consultez http://ruby-doc.org/docs/ProgrammingRuby/ (le “Pickaxe”), il devrait pouvoir vous aider avec des questions comme celle-ci dans le futur.

Dans Ruby, l’opérateur === est utilisé pour tester l’égalité dans une clause when d’une déclaration de case . Dans d’autres langues, ce qui précède est vrai.

À ma connaissance, Ruby n’a pas de vrais opérateurs , ce sont toutes des méthodes qui sont invoquées sur le LHS de l’expression, en passant dans le RHS de l’expression. Donc, vraiment, vous pouvez remplacer n’importe quel “opérateur” que vous voulez dans vos classes pour effectuer ce que vous voulez (analogue à la surcharge d’opérateur en C ++).