Comprendre les symboles en Ruby
Vous êtes probablement déjà tombé sur des symboles en Ruby, souvent utilisés pour les clés des hash. Exemple :
{:foo => 'bar'}
:foo est un symbole. 'bar' est une string. Mais nous pourrions faire
{'foo' => 'bar'}
Alors pourquoi utiliser les symboles ? Supposons le cas suivant :
x = :sym
y = :sym
(x.__id__ == y.__id__ ) && ( :sym.__id__ == x.__id__)
La comparaison ici retournera vrai. En effet, un même symbole sera toujours le même objet en mémoire, dans toute votre application. Cela ne pose pas de problèmes car un symbole est également non mutable.
Et le même avec des strings :
x = "string"
y = "string"
(x.__id__ == y.__id__ ) || ( "string".__id__ == x.__id__)
Ici, x, y et "string" sont tous les trois des objets différents avec des __id__ différents. 3 objets ont donc été initiés en mémoire !
Maintenant reprenons notre hash de tout à l'heure avec la comparaison string/symbole. Mais en créant deux hashes !
Avec la version symboles :
{:foo => 'bar'}
{:foo => 'doe'}
Nous créons 5 objets en mémoire : deux hashes; un symbole et deux string.
Dans la version strings :
{'foo' => 'bar'}
{'foo' => 'doe'}
Ici, nous créons 6 objets en mémoire : deux hashes et 4 strings.
Dans un cas d'école comme celui-ci, cela ne change pas grand chose. Mais dans un cas réel d'application, si vous remplacez tous vos symboles par des strings, votre consommation mémoire va rapidement s'élever. Alors commencez dès maintenant à remplacer toutes vos strings qui sont non mutables (en gros, toutes vos clés de hashes et les options dans les méthodes) par des symboles :)
Commentaires
Qu'entends-tu par "besoins" ? Des idées d'applications à développer ? Désolé. Sur ce coup la il faudra que tu te débrouille ;)


C'est toujours utile a savoir. Bravo pour ton blog je suis plutot fan ^^ J'aimerai me lancer dans des projets de développement est-ce que tu aurai des pistes ou même des besoins de peronnels?