Ihr Codebeispiel wurde nicht auf einen Teil Ihres Themas erweitert, nämlich auf Symbole, sodass dieser Teil der Frage unbeantwortet blieb.
Wenn Sie zwei Zeichenfolgen haben, foo und bar, und beide entweder eine Zeichenfolge oder ein Symbol sein können, können Sie die Gleichheit mit testen
foo.to_s == bar.to_s
Es ist etwas effizienter, die Zeichenfolgenkonvertierungen für Operanden mit bekanntem Typ zu überspringen. Also, wenn foo immer eine Zeichenfolge ist
foo == bar.to_s
Aber der Effizienzgewinn ist es mit ziemlicher Sicherheit nicht wert, zusätzliche Arbeit für den Anrufer zu verlangen.
Vermeiden Sie vor Ruby 2.2 das Internieren unkontrollierter Eingabezeichenfolgen zu Vergleichszwecken (mit Zeichenfolgen oder Symbolen), da Symbole nicht durch Müll gesammelt werden und Sie sich daher durch Ressourcenerschöpfung dem Denial-of-Service öffnen können. Beschränken Sie die Verwendung von Symbolen auf Werte, die Sie steuern, dh Literale in Ihrem Code und vertrauenswürdige Konfigurationseigenschaften.
Ruby 2.2 führte die Speicherbereinigung von Symbolen ein .
foo.intern == bar.intern
Wäre besser - das Internieren einer Zeichenfolge ist im Durchschnitt effizienter als das Erstellen einer Zeichenfolge aus einem Symbol. (Wenn eine bestimmte Zeichenfolge zuvor interniert wurde, wird nur das Symbol zurückgegeben.)