2012-08-08 8 views
5

He siguientes declaracionesCómo string emitido a booleano en Clojure

(if "true" (println "working") (println "not working")) 

resultado es - trabajando

(if "false" (println "working") (println "not working")) 

resultado es - trabajando

Tanto el resultado de tiempo es el mismo, ¿Cómo puede Yo hechizo correctamente string a boolean en clojure.

Respuesta

2

Usando read-string

(if (read-string "false") (println "working") (println "not working")) 
9

Se puede crear un nuevo objeto booleano de Java, que tiene un método que acepta una cadena. Si luego usa la función booleana de clojure, puede hacer que funcione en clojure.

(boolean (Boolean/valueOf "true")) ;;true 
(boolean (Boolean/valueOf "false")) ;;false 
+7

* * Nunca haga esto. Usar el constructor 'Boolean' siempre es un error, siempre; ni siquiera debería existir. En su lugar, use '(Boolean/valueOf x)'. – amalloy

+0

¿Qué quieres decir con que siempre es un error? – smunk

+3

Consulte http://docs.oracle.com/javase/6/docs/api/java/lang/Boolean.html#Boolean(boolean) para obtener una de las muchas explicaciones en la web sobre por qué no debería hacerlo. O google for 'java boolean constructor' para ver una discusión. ** editar ** En realidad, el javadoc vinculado implica que el espacio/velocidad es la razón; es mejor buscar en Google y ver por qué está semánticamente mal. – amalloy

11

Si tiene que tratar a las cadenas como booleanos, read-string es una opción razonable. Pero si usted sabe la entrada será un valor lógico bien formada (es decir, ya sea "verdadero" o "falso"), sólo puede utilizar utilizar el conjunto #{"true"} como una función:

(def truthy? #{"true"}) 
(if (truthy? x) 
    ...) 

O, si se quiere para el tratamiento de cualquier cadena, pero "falso" como Truthy (más o menos la forma en Clojure ve truthiness en nada), puede utilizar (complement #{"false"}):

(def truthy? (complement #{"false"})) 
(if (truthy? x) 
    ...) 

Si usted quiere hacer algo tan vil como conversiones débil de tipificación de PHP, usted tiene que escribir las reglas usted mismo.

+2

¿Por qué ir de forma cuando solo puedes usar '='? Ej: '(def truthy? (Partial =" true "))' – Ankur

+3

Los juegos son simplemente más fríos. No hay mejor razón que eso. – amalloy

2

Siempre debe considerar envolver el código para hacer este tipo de conversión en una función claramente nombrada. Esto le permite ser más descriptivo en su código, y también le permite cambiar la implementación si es necesario en una fecha posterior (por ejemplo, si identifica otras cadenas que también se deben contar como verdaderas).

me gustaría sugerir algo como:

(defn true-string? [s] 
    (= s "true")) 

Aplicando esto a los casos de prueba:

(if (true-string? "true") (println "working") (println "not working")) 
=> working 

(if (true-string? "false") (println "working") (println "not working")) 
=> not working 
Cuestiones relacionadas