Il codice di esempio non si è espanso su una parte dell'argomento, ovvero i simboli, e quindi quella parte della domanda è rimasta senza risposta.
Se hai due stringhe, foo e bar, ed entrambe possono essere una stringa o un simbolo, puoi testare l'uguaglianza con
foo.to_s == bar.to_s
È un po 'più efficiente saltare le conversioni di stringhe sugli operandi di tipo noto. Quindi, se foo è sempre una stringa
foo == bar.to_s
Ma il guadagno di efficienza quasi certamente non vale la pena richiedere alcun lavoro extra da parte di chi chiama.
Prima di Ruby 2.2, evita di internare stringhe di input non controllate a scopo di confronto (con stringhe o simboli), perché i simboli non sono raccolti in modo spazzatura, e quindi puoi aprirti alla negazione del servizio attraverso l'esaurimento delle risorse. Limita l'uso dei simboli ai valori che controlli, ad esempio letterali nel codice e proprietà di configurazione affidabili.
Ruby 2.2 ha introdotto la garbage collection di simboli .
foo.intern == bar.intern
sarebbe meglio: internare una stringa è in media più efficiente che creare una stringa da un simbolo. (Se una determinata stringa è stata precedentemente internata, restituisce solo il simbolo.)