2012-08-08 35 views
5
爲布爾

我有如下語句如何投放串用Clojure

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

結果是 - 工作

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

結果是 - 工作

這兩個時間的結果是一樣的,如何能我正確地將字符串轉換爲clojure中的布爾值。

回答

2

使用read-string

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

您可以創建一個新的Java Boolean對象,其接受字符串的方法。如果你使用clojure的布爾函數,你實際上可以在clojure中工作。

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

*不要做這個*。總是使用'Boolean'構造函數總是一個錯誤;它甚至不應該存在。相反,使用'(Boolean/valueOf x)'。 – amalloy 2012-08-08 06:41:12

+0

你是什麼意思這總是一個錯誤? – smunk 2012-08-08 06:42:34

+3

請參閱http://docs.oracle.com/javase/6/docs/api/java/lang/Boolean.html#Boolean(boolean),瞭解網站上爲什麼不應該這樣做的衆多解釋之一。或谷歌的'Java布爾構造函數'看到討論。 **編輯**實際上,鏈接的javadoc暗示空間/速度是原因;你最好使用谷歌搜索,看看爲什麼它的語義錯誤。 – amalloy 2012-08-08 06:43:26

11

如果您必須將字符串視爲布爾值,則read-string是合理的選擇。但如果你知道的投入將是一個結構良好的布爾(即,「真」或「假」),你可以使用使用set #{"true"}作爲一個函數:

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

或者,如果你想對待任何字符串,但「假」爲truthy(Clojure的大概是如何看待上的任何感實性),可以使用(complement #{"false"})

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

如果你想要做的沒什麼兩樣了,因爲PHP的弱類型轉換的東西,你會必須自己寫規則。

+2

爲什麼要設置方式,當你可以只使用'='?例如:'(def truthy?(partial =「true」))' – Ankur 2012-08-08 07:04:23

+3

套件只是比較涼爽。沒有比這更好的理由。 – amalloy 2012-08-08 07:11:40

2

您應該總是考慮將代碼轉換爲明確命名的函數。這使您能夠在代碼中更具描述性,並且還允許您在以後需要時更改實現(例如,如果您確定其他字符串也應該算作真理)。

我建議是這樣的:

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

將此應用於測試用例:

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

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