Simboluri vs. Șiruri de Caractere în Ruby: :simbol, Imutabilitate și Memorie în Ruby

Ghid complet pentru simboluri în Ruby: diferența esențială față de șiruri, imutabilitatea garantată, partajarea memoriei prin object_id și utilizarea ca chei de dicționar.

Sintaxă
status = :activ; :nume.object_id == :nume.object_id

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).