2010-02-25 12 views

Respuesta

46

Igualdad en Clojure (la función =) siempre prueba el valor, no la identidad, por lo que dos cadenas son = si tienen el mismo contenido.

Para la mayoría de los tipos de Java, incluida la cadena, Clojure = se envía a Java .equals. String.equals se define como "representa la misma secuencia de caracteres".

Si desea probar la identidad (¿Están estos punteros en la misma ubicación en la memoria?) Use la función identical?.

+0

Necesito comparar un token de seguridad, entonces necesito una función que compruebe si el contenido es exactamente el mismo y no acepta comodines ni expresiones regex. ¿Sabes si la función = de clojure satisface mi necesidad o necesito una función más específica? – jonathanrz

+1

Clojure '=' no usa comodines ni expresiones regulares. –

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

La JVM tiene un grupo de cadenas que contiene a lo sumo una entrada por valor, por lo que la identidad y la igualdad de valores son la misma comparación. Hay maneras de usar StringBuilder. y String. donde esto no es estrictamente cierto, pero debido a que la función de igualdad de clojure llama a .equals, se realizará una comparación de valores si las identidades son diferentes.

+13

'(idéntico?" Hello "(str" hel "" lo "))' es falso. El conjunto de cadenas internas de Java es solo para cadenas que son constantes. Entonces '(idéntico?" Hola "" hola ")' es verdadero, pero tan pronto como calcule una cadena no será igual a cualquier otra. Puede forzar la búsqueda/almacenamiento en el grupo con '(idéntico?" Hola "(.intern (str" hel "" lo ")))' (verdadero) – amalloy

Cuestiones relacionadas