Les symboles sont comme les chaînes de caractères mais ils sont immuables - ils ne peuvent pas être modifiés.
Ils ne sont mis en mémoire qu'une seule fois, ce qui les rend très efficaces pour des choses comme les clés dans les hachages, mais ils restent en mémoire jusqu'à la sortie du programme. Cela les rend gourmands en mémoire si vous les utilisez mal.
Si vous créez dynamiquement de nombreux symboles, vous allouez beaucoup de mémoire qui ne pourra être libérée qu'à la fin de votre programme. Vous ne devriez créer des symboles de façon dynamique (en utilisant string.to_sym
) si vous savez que vous le ferez :
- besoin d'accéder de manière répétée au symbole
- pas besoin de les modifier
Comme je l'ai dit précédemment, ils sont utiles pour des choses comme les hachages - où l'on se soucie davantage de l'indice de confiance. identité de la variable que sa valeur. Les symboles, lorsqu'ils sont correctement utilisés, constituent un moyen lisible et efficace de transmettre une identité.
Je vais expliquer ce que je veux dire sur l'immuabilité des symboles RE votre commentaire.
Les chaînes de caractères sont comme des tableaux ; elles peuvent être modifiées sur place :
12:17:44 ~$ irb
irb(main):001:0> string = "Hello World!"
=> "Hello World!"
irb(main):002:0> string[5] = 'z'
=> "z"
irb(main):003:0> string
=> "HellozWorld!"
irb(main):004:0>
Les symboles ressemblent davantage à des chiffres ; ils ne peuvent pas être modifiés sur place :
irb(main):011:0> symbol = :Hello_World
=> :Hello_World
irb(main):012:0> symbol[5] = 'z'
NoMethodError: undefined method `[]=' for :Hello_World:Symbol
from (irb):12
from :0
39 votes
Est-ce que vous travailliez à travers le EdgeCase Ruby koans aussi ?
1 votes
Quelqu'un pourrait-il mettre à jour cette question pour préciser Ruby 2.1 o Versions de Ruby antérieures à 2.2
0 votes
@dewet : pourriez-vous également mentionner pourquoi ?
2 votes
@ack_inc parce que les symboles sont collectés depuis Ruby 2.2 alors qu'avant ils vivaient en mémoire pour toujours. La création d'un grand nombre de symboles a donc un impact radicalement différent (plus faible) à partir de Ruby 2.2.