Je vais fortement citer l'Objet de la documentation ici, parce que je pense qu'il a quelques grandes explications. Je vous encourage à le lire, et aussi à la documentation de ces méthodes car elles sont remplacées dans d'autres classes, à l'instar de la Chaîne.
Remarque: si vous voulez les essayer pour vous-même sur des objets différents, utiliser quelque chose comme ceci:
class Object
def all_equals(o)
ops = [:==, :===, :eql?, :equal?]
Hash[ops.map(&:to_s).zip(ops.map {|s| send(s, o) })]
end
end
"a".all_equals "a" # => {"=="=>true, "==="=>true, "eql?"=>true, "equal?"=>false}
==
- générique de "l'égalité"
Au niveau de l'Objet, ==
renvoie true uniquement si obj
et other
sont le même objet. En général, cette méthode est redéfinie dans les classes descendantes de fournir spécifiques à la classe de sens.
C'est le plus commun de comparaison, et donc les plus fondamentales de l'endroit où vous (en tant qu'auteur d'une classe) de décider si deux objets sont "égaux" ou pas.
===
- en cas d'égalité
Pour la classe de l'Objet, effectivement la même que l'appel à la #==
, mais généralement remplacée par descendants de fournir une sémantique correcte dans le cas des déclarations.
C'est incroyablement utile. Des exemples de choses qui sont intéressantes ===
implémentations:
- Gamme
- Regex
- Proc (en Ruby 1.9)
Ainsi, vous pouvez faire des choses comme:
case some_object
when /a regex/
# The regex matches
when 2..4
# some_object is in the range 2..4
when lambda {|x| some_crazy_custom_predicate }
# the lambda returned true
end
Voir ma réponse ici pour un exemple clair de la façon dont case
+Regex
peut rendre le code beaucoup plus propre. Et bien sûr, en fournissant votre propre ===
mise en œuvre, vous pouvez obtenir personnalisé case
de la sémantique.
eql?
- Hash
de l'égalité
L' eql?
méthode retourne true si obj
et other
se réfèrent à la même clé de hachage. Il est utilisé par Hash
pour tester les membres de l'égalité. Pour les objets de la classe Object
, eql?
est synonyme d' ==
. Les sous-classes normalement continuer cette tradition en aliasing eql?
de leur substituée ==
méthode, mais il y a des exceptions. Numeric
types, par exemple, d'effectuer le type de conversion à travers ==
, mais pas à travers des eql?
, donc:
1 == 1.0 #=> true
1.eql? 1.0 #=> false
Vous êtes donc libre de remplacer cette valeur pour votre propre usage, ou vous pouvez remplacer ==
et l'utilisation alias :eql? :==
donc, les deux méthodes se comportent de la même manière.
equal?
- identité de comparaison
Contrairement aux ==
, equal?
méthode ne doit jamais être remplacées par des sous-classes: il est utilisé pour déterminer l'identité de l'objet (c'est - a.equal?(b)
mfi a
est le même objet que l' b
).
C'est effectivement le pointeur de la comparaison.