2010-02-25 2 views

Antwort

46

Gleichheit in Clojure (die = Funktion) prüft immer Wert, nicht Identität, so sind zwei Zeichenketten =, wenn sie den gleichen Inhalt haben. Für die meisten Java-Typen, einschließlich String, sendet Clojure = an Java .equals. String.equals ist definiert als "stellt die gleiche Zeichenfolge dar".

Wenn Sie Identität testen möchten (Sind diese Zeiger auf den gleichen Speicherort im Speicher?) Verwenden Sie die identical?-Funktion.

+0

Ich muss ein Sicherheitstoken vergleichen, also brauche ich eine Funktion, die Überprüfen Sie, ob der Inhalt identisch ist und keine Platzhalter oder Regex-Ausdrücke akzeptieren. Weißt du, ob die = Funktion von clojure meine Bedürfnisse befriedigt oder ich eine spezifischere Funktion brauche? – jonathanrz

+1

Clojure '=' verwendet keine Platzhalter oder regulären Ausdrücke. –

8
(= "hello" (str "hel" "lo")) 
; => true 

Die JVM hat einen String-Pool, der höchstens einen Eintrag pro Wert enthält, daher sind Identität und Wertgleichheit die gleichen Vergleiche. Es gibt Möglichkeiten, StringBuilder. und String. zu verwenden, wo dies nicht genau richtig ist, aber weil die Clojure-Gleichheitsfunktion .equals aufruft, wird ein Wertvergleich durchgeführt, wenn die Identitäten unterschiedlich sind.

+13

'(identisch?" Hallo "(str" hel "" lo "))' ist falsch. Der Java-Pool von intern gespeicherten Strings ist nur für Strings, die Konstanten sind. Also '(identisch?" Hallo "" hallo ")' ist wahr, aber sobald Sie eine Zeichenfolge berechnen, ist sie nicht Zeiger-gleich zu anderen. Sie können Lookup/Storage im Pool mit '(identisch?" Hallo "(.intern (str" hel "" lo "))) erzwingen' '(true) – amalloy

Verwandte Themen