Les débutants auront du mal avec l'égalité méthodes:
-
a == b : vérifie si a et b sont égaux. C'est le plus utile.
-
un.eql? b : vérifie également si a et b sont égaux, mais il est parfois plus strictes (il peut vérifier que a et b ont le même type, par exemple). Il est principalement utilisé dans les tables de hachage.
-
un.l'égalité? b : vérifie si a et b sont de la même objet (contrôle d'identité).
-
a === b : utilisé dans le cas des énoncés (je l'ai lu comme "un des matchs b").
Ces exemples devraient clarifier les 3 premières méthodes:
a = b = "joe"
a==b # true
a.eql? b # true
a.equal? b # true (a.object_id == b.object_id)
a = "joe"
b = "joe"
a==b # true
a.eql? b # true
a.equal? b # false (a.object_id != b.object_id)
a = 1
b = 1.0
a==b # true
a.eql? b # false (a.class != b.class)
a.equal? b # false
Notez que ==, eql? et l'égalité? doit toujours être symétrique : si a==b alors b==.
Notez aussi que l' == et eql? sont mis en œuvre dans la classe de l'Objet en tant qu'alias de l'égalité?, donc, si vous créez une nouvelle classe et souhaitez == et eql? pour dire autre chose que la simple identité, alors vous avez besoin de les remplacer à la fois. Par exemple:
class Person
attr_reader name
def == (rhs)
rhs.name == self.name # compare person by their name
end
def eql? (rhs)
self == rhs
end
# never override the equal? method!
end
L' === méthode se comporte différemment. Tout d'abord, il n'est pas symétrique (a===b n'a pas implique que b===un). Comme je l'ai dit, vous pouvez lire un===b "correspond à un b". Voici quelques exemples:
# === is usually simply an alias for ==
"joe" === "joe" # true
"joe" === "bob" # false
# but ranges match any value they include
(1..10) === 5 # true
(1..10) === 19 # false
(1..10) === (1..10) # false (the range does not include itself)
# arrays just match equal arrays, but they do not match included values!
[1,2,3] === [1,2,3] # true
[1,2,3] === 2 # false
# classes match their instances and instances of derived classes
String === "joe" # true
String === 1.5 # false (1.5 is not a String)
String === String # false (the String class is not itself a String)
Le cas affirmation est basée sur l' === méthode:
case a
when "joe": puts "1"
when 1.0 : puts "2"
when (1..10), (15..20): puts "3"
else puts "4"
end
est équivalent à ceci:
if "joe" === a
puts "1"
elsif 1.0 === a
puts "2"
elsif (1..10) === a || (15..20) === a
puts "3"
else
puts "4"
end
Si vous définissez une nouvelle classe dont les instances représentent une sorte de conteneur ou de la plage (si il a quelque chose comme un ? ou un match? méthode), alors vous trouverez peut-être utile pour remplacer l' === méthode comme ceci:
class Subnet
[...]
def include? (ip_address_or_subnet)
[...]
end
def === (rhs)
self.include? rhs
end
end
case destination_ip
when white_listed_subnet: puts "the ip belongs to the white-listed subnet"
when black_listed_subnet: puts "the ip belongs to the black-listed subnet"
[...]
end