Una dintre cele mai distinctive trăsături ale limbajului Ruby este distincția clară dintre șiruri de caractere (String) și simboluri (Symbol). Un simbol (prefixat cu două puncte :nume) este un identificator intern imutabil și unic în memorie, ideal pentru reprezentarea cheilor de dicționar, a numelor de metode și a stărilor de sistem.
Demonstrarea alocării memoriei cu object_id
# 1. Șirurile de caractere (String) creează obiecte NOI la fiecare invocare:
id_string1 = "utilizator".object_id
id_string2 = "utilizator".object_id
puts "String 1 ID: #{id_string1}"
puts "String 2 ID: #{id_string2}"
puts "Stringurile au același ID? #{id_string1 == id_string2}" # false! (alocări separate de memorie)
# 2. Simbolurile (Symbol) partajează MEREU aceeași locație unică de memorie:
id_simbol1 = :utilizator.object_id
id_simbol2 = :utilizator.object_id
puts "\nSimbol 1 ID: #{id_simbol1}"
puts "Simbol 2 ID: #{id_simbol2}"
puts "Simbolurile au același ID? #{id_simbol1 == id_simbol2}" # true! (zero alocări suplimentare)
| Criteriu | String („text”) |
Symbol (:simbol) |
|---|---|---|
| Mutabilitate | Mutabil în mod implicit (poate fi modificat in-place). | Complet imutabil (nu poate fi alterat niciodată). |
| Consum RAM | Alocă memorie nouă la fiecare apariție literală. | O singură instanță salvată permanent în Symbol Table. |
| Viteză de comparare | Lentă (compară caracter cu caracter O(n)). | Instantanee O(1) (compară direct pointerii numerici). |
| Utilizare recomandată | Date textuale, intrări de la utilizator, mesaje. | Chei de hash, parametri de stare (:pending, :success). |