2012-08-08 5 views
5

Ich habe folgende AussagenWie Zeichenfolge werfen in Clojure boolean

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

Ergebnis ist - Arbeits

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

Ergebnis ist - Arbeits

Sowohl die Zeit Ergebnis ist dasselbe: Wie kann Ich zeichne richtig String in Boolean in Clojure.

Antwort

2

Mit read-string

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

Sie können ein neues Java-Boolean-Objekt erstellen, das ein Verfahren hat, die eine Zeichenfolge annimmt. Wenn Sie dann die boolesche Funktion von clojure verwenden, können Sie sie in clojure verwenden.

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

* Nie dies tun *. Der 'Boolean'-Konstruktor ist immer ein Fehler, immer; es sollte nicht einmal existieren. Verwenden Sie stattdessen '(Boolean/valueOf x)'. – amalloy

+0

Was meinst du, es ist immer ein Fehler? – smunk

+3

Siehe http://docs.oracle.com/javase/6/docs/api/java/lang/Boolean.html#Boolean(boolean) für eine der vielen Erklärungen im Internet darüber, warum Sie es nicht tun sollten. Oder google nach 'java boolean constructor', um eine Diskussion zu sehen. ** edit ** Tatsächlich bedeutet das verknüpfte Javadoc, dass Speicherplatz/Geschwindigkeit der Grund sind; Du bist besser dran zu googeln und zu sehen, warum das semantisch falsch ist. – amalloy

11

Wenn Sie Strings als booleans behandeln müssen, ist read-string eine vernünftige Wahl. Aber wenn Sie wissen, dass die Eingabe eine wohlgeformte boolean sein wird (dh entweder „true“ oder „false“), können Sie nur verwenden, verwenden Sie den Satz #{"true"} als Funktion:

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

Oder, wenn Sie wollen eine beliebige Zeichenfolge aber „false“ als truthy zu behandeln (etwa wie Clojure Truthiness auf etwas betrachtet), können Sie (complement #{"false"}) verwenden:

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

Wenn Sie etwas so vile wie PHP schwache Typisierung Konvertierungen machen wollen, werden Sie muss die Regeln selbst schreiben.

+2

Warum gehen Sätze, wenn Sie einfach '=' verwenden können? Beispiel: '(def truthy? (Partially =" true "))' – Ankur

+3

Sets sind einfach cooler. Kein besserer Grund als das. – amalloy

2

Sie sollten immer daran denken, Code einzupacken, um diese Art von Konvertierung in eine klar benannte Funktion zu verwandeln. Auf diese Weise können Sie in Ihrem Code beschreibender sein, und Sie können die Implementierung bei Bedarf zu einem späteren Zeitpunkt ändern (z. B. wenn Sie andere Zeichenfolgen identifizieren, die ebenfalls als truthy gezählt werden sollen).

würde ich so etwas wie vorschlagen:

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

diese Anwendung auf Ihrem Testfälle:

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

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