Juste pour démontrer certaines des choses mentionnées dans les réponses :
require 'benchmark'
n = 1_000_000
print '"foo".equal? "foo" -> ', ("foo".equal? "foo"), "\n"
print '"foo" == "foo" -> ', ("foo" == "foo" ), "\n"
print ':foo.equal? :foo -> ', (:foo.equal? :foo ), "\n"
print ':foo == :foo -> ', (:foo == :foo ), "\n"
Benchmark.bm(10) do |b|
b.report('string') { n.times { "foo".equal? "foo" }}
b.report('str == str') { n.times { "foo" == "foo" }}
b.report('symbol') { n.times { :foo.equal? :foo }}
b.report('sym == sym') { n.times { :foo == :foo }}
end
L'exécution des sorties :
"foo".equal? "foo" -> false
"foo" == "foo" -> true
:foo.equal? :foo -> true
:foo == :foo -> true
Ainsi, la comparaison d'une chaîne de caractères à une chaîne de caractères en utilisant equal?
échoue parce que ce sont des objets différents, même si leur contenu est égal. ==
compare le contenu, et les contrôles équivalents avec des symboles sont beaucoup plus rapides.
user system total real
string 0.370000 0.000000 0.370000 ( 0.371700)
str == str 0.330000 0.000000 0.330000 ( 0.326368)
symbol 0.170000 0.000000 0.170000 ( 0.174641)
sym == sym 0.180000 0.000000 0.180000 ( 0.179374)
Les deux tests de symboles sont fondamentalement les mêmes en termes de vitesse. Après 1 000 000 d'itérations, il n'y a que 0,004733 seconde de différence, donc je dirais qu'il faut choisir lequel utiliser.
1 votes
Duplicata possible de Comprendre les symboles en Ruby
7 votes
Essayez de regarder ça : Le guide Ruby_Nouveau venu des symboles
0 votes
Cette vidéo vous dit tout ce que vous devez savoir sur les symboles.