110 votes

Que fait l'opérateur "===" en Ruby ?

Duplicata 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 son fonctionnement ?

263voto

Jörg W Mittag Points 153275

Comme pour toutes les autres méthodes en Ruby (ou en fait dans presque tous les langages orientés objet),

a === b

signifie que l'auteur de a de la classe de l'école veut qu'il signifie.

Cependant, si vous ne voulez pas embrouiller vos collègues, la convention est la suivante === es el cas de subsomption opérateur. Il s'agit essentiellement d'un opérateur booléen qui pose la question " Si j'ai un tiroir étiqueté a serait-il judicieux de mettre b dans ce tiroir ? "

Une formulation alternative est " Si a décrit un ensemble, serait b être 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

La principale utilisation de l === L'opérateur est dans case les expressions, puisque

case foo
when bar
  baz
when quux
  flurb
else
  blarf
end

se traduit par quelque chose (approximativement) comme

_temp = foo

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

Notez que si vous voulez rechercher cet opérateur, il est généralement appelé le opérateur triple égal o opérateur tripartite o 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 s'attendrait à ce que l'égalité soit symétrique : si a est égal à b entonces b doit être également égal à a . De plus, on s'attendrait à ce que l'égalité soit transitive : si a == b et b == c entonces a == c . Bien qu'il n'y ait aucun moyen de réellement garantie que dans un langage à diffusion unique comme Ruby, vous devriez au moins faire un effort pour préserver cette propriété (par exemple, en suivant la méthode coerce protocole).

Toutefois, pour === il n'y a aucune attente de symétrie ou de transitivité. En fait, c'est très bien conçu no symétrique. C'est pourquoi je n'aime pas l'appeler autrement que par un nom. à distance ressemble à l'égalité. C'est aussi pour ça que je pense qu'il aurait dû s'appeler autrement. ~~~ ou autre.

6voto

Bauerpauer Points 186

Merci pour ta modification Jacob, j'étais sur le point de t'appeler ;) Je vais quand même poster quelques exemples. 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, caissier http://ruby-doc.org/docs/ProgrammingRuby/ (la "pioche"), elle devrait pouvoir vous aider à répondre à des questions de ce type à l'avenir.

3voto

Jacob Relkin Points 90729

En Ruby, le === L'opérateur est utilisé pour tester l'égalité au sein d'un when clause d'un case déclaration. Dans d'autres langues, ce qui précède est vrai.

A ma connaissance, Ruby ne dispose pas de Les vrais opérateurs ils sont tous méthodes qui sont invoqués sur le LHS de l'expression, en passant dans le RHS de l'expression. Donc, en réalité, vous pouvez surcharger n'importe quel "opérateur" dans vos classes pour qu'il exécute ce que vous voulez (analogue à la surcharge d'opérateurs en C++).

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X