Die prägnanteste Methode zum Testen der Zeichenfolgengleichheit (nicht der Objektgleichheit) für Ruby-Zeichenfolgen oder -Symbole?

84

Ich mache das immer, um die String-Gleichheit in Ruby zu testen:

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

Ist dies der richtige Weg, ohne die Objektgleichheit zu testen?

Ich suche nach der präzisesten Möglichkeit, Zeichenfolgen anhand ihres Inhalts zu testen.

Mit den Klammern und dem Fragezeichen wirkt dies etwas klobig.

Bryan Locke
quelle

Antworten:

14

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 .

sheldonh
quelle
6
foo.intern == bar.internWä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.)
Chuck
4
Eigentlich halte ich es nicht für eine gute Idee, ein Symbol aus einer Zeichenfolge zu erstellen, um bei einigen Vergleichen ein wenig zu sparen, da Symbole verloren gehen, wenn die Zeichenfolge nicht übereinstimmt. Symbole werden nicht durch Müll gesammelt und sollten daher nicht erstellt werden, wenn Sie sie nicht behalten möchten. Andernfalls erstellen Sie einen Vektor für einen Denial-of-Service-Angriff.
Patru
Daran hatte ich nicht gedacht. Vielen Dank, ich habe meine Antwort basierend auf Ihrem Kommentar geändert.
Sheldonh
1
Dies muss angepasst werden: "Vermeiden Sie das Internieren unkontrollierter [...] Eingabezeichenfolgen, da Symbole nicht durch Müll gesammelt werden." Vielen Dank, dass Sie @sheldonh.
Nate