L'esempio di codice non è stato ampliato su parte del tuo argomento, ovvero simboli, e quindi la parte della domanda non ha ricevuto risposta.
Se si dispone di due stringhe, foo e bar, ed entrambi possono essere una stringa o un simbolo, è possibile verificare l'uguaglianza con
foo.to_s == bar.to_s
E 'un po' più efficiente di saltare le conversioni di stringhe su operandi con tipo conosciuto. Quindi, se foo è sempre una stringa
foo == bar.to_s
Ma il guadagno di efficienza non è quasi certamente la pena di chiedere alcun lavoro supplementare per conto del chiamante.
Prima di Ruby 2.2, evitare di internare stringhe di input non controllate ai fini del confronto (con stringhe o simboli), perché i simboli non sono garbage collection, e quindi è possibile aprirsi a denial of service attraverso l'esaurimento delle risorse. Limita il tuo utilizzo dei simboli ai valori che controlli, ovvero i valori letterali nel codice e le proprietà di configurazione attendibili.
Ruby 2.2 introduced garbage collection of symbols.
Questo è corretto. Il comparatore di identità è 'uguale?'. – Chuck