68 votes

=== contre == en rubis

En Ruby, quelle est la différence entre == et ===? Le RDoc dit

Case Equality-Pour la classe Object, identique à l'appel # #=, mais généralement substitué par les descendants pour fournir une sémantique significative dans les instructions case.

Est-ce que #== identique à == ? Et pourriez-vous donner un exemple de quand / comment cela est utilisé dans les déclarations de cas?

124voto

Jörg W Mittag Points 153275

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

10voto

sepp2k Points 157757

Oui, en #== les docs signifie "la méthode d'instance == de l'objet courant".

=== est utilisée dans le cas des états en tant que tels:

case obj
when x
  foo
when y
  bar
end

Est le même que

if x === obj
  foo
elsif y === obj
  bar
end

Certaines classes qui définissent leur propre === sont de la Gamme (à agir comme l' include?), la Classe (d'agir comme obj.is_a?(klass)) et Regexp (à agir comme l' =~ sauf booléen). Certaines classes qui ne définissent pas leur propre === numériques sont classes et de la Corde.

Donc

case x
when 0
  puts "Lots"
when Numeric
  puts(100.0 / x)
when /^\d+$/
  puts(100.0 / x.to_f)
default
  raise ArgumentError, "x is not a number or numeric string"
end

est le même que

if 0 == x
  puts "Lots"
elsif x.is_a? Numeric
  puts(100.0 / x)
elsif x =~ /^\d+$/
  puts(100.0 / x.to_f)
else
  raise ArgumentError, "x is not a number or numeric string"
end

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