Twoja próbka kodu nie rozwinęła się w części twojego tematu, a mianowicie symboli, więc ta część pytania pozostała bez odpowiedzi.
Jeśli masz dwa ciągi, foo i bar, i oba mogą być łańcuchem lub symbolem, możesz przetestować równość za pomocą
foo.to_s == bar.to_s
Trochę bardziej wydajne jest pomijanie konwersji ciągów w operandach o znanym typie. Więc jeśli foo jest zawsze łańcuchem
foo == bar.to_s
Ale wzrost wydajności prawie na pewno nie jest wart żądania dodatkowej pracy w imieniu dzwoniącego.
Przed wersją Ruby 2.2 unikaj internowania niekontrolowanych ciągów wejściowych w celu porównania (z łańcuchami lub symbolami), ponieważ symbole nie są zbierane jako śmieci, więc możesz otworzyć się na odmowę usługi poprzez wyczerpanie zasobów. Ogranicz użycie symboli do kontrolowanych wartości, tj. Literałów w kodzie i zaufanych właściwości konfiguracyjnych.
Ruby 2.2 wprowadził zbieranie śmieci symboli .
foo.intern == bar.intern
byłoby lepsze - internowanie łańcucha jest średnio bardziej wydajne niż tworzenie łańcucha z symbolu. (Jeśli dany ciąg był wcześniej internowany, po prostu zwraca symbol.)