Najbardziej zwięzły sposób testowania równości ciągów znaków (nie równości obiektów) dla łańcuchów lub symboli Rubiego?

86

Zawsze robię to, aby sprawdzić równość ciągów znaków w Rubim:

if mystring.eql?(yourstring)
 puts "same"
else
 puts "different"
end

Czy to jest właściwy sposób na zrobienie tego bez testowania równości obiektów?

Szukam najbardziej zwięzłego sposobu testowania ciągów znaków na podstawie ich zawartości.

Z nawiasami i znakiem zapytania wydaje się to trochę niezgrabne.

Bryan Locke
źródło

Odpowiedzi:

14

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 .

sheldonh
źródło
6
foo.intern == bar.internbył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.)
Chuck,
4
Właściwie nie sądzę, aby dobrym pomysłem było tworzenie symbolu z łańcucha tylko po to, aby trochę zaoszczędzić na niektórych porównaniach, ponieważ spowoduje to wyciek symboli, jeśli łańcuch nie będzie pasował. Symbole nie są zbierane jako śmieci i dlatego nie powinny być tworzone, jeśli nie zamierzasz ich przechowywać, w przeciwnym razie utworzysz wektor do ataku typu „odmowa usługi”.
Patru
Ojej, nie pomyślałem o tym. Dzięki, zmodyfikowałem moją odpowiedź na podstawie Twojego komentarza.
sheldonh
1
Należy to powtórzyć: „Unikaj internowania niekontrolowanych ciągów wejściowych [...], ponieważ symbole nie są odśmiecane”. Dziękuję @sheldonh.
Nate,