我有如下語句如何投放串用Clojure
(if "true" (println "working") (println "not working"))
結果是 - 工作
(if "false" (println "working") (println "not working"))
結果是 - 工作
這兩個時間的結果是一樣的,如何能我正確地將字符串轉換爲clojure中的布爾值。
我有如下語句如何投放串用Clojure
(if "true" (println "working") (println "not working"))
結果是 - 工作
(if "false" (println "working") (println "not working"))
結果是 - 工作
這兩個時間的結果是一樣的,如何能我正確地將字符串轉換爲clojure中的布爾值。
使用read-string
(if (read-string "false") (println "working") (println "not working"))
您可以創建一個新的Java Boolean對象,其接受字符串的方法。如果你使用clojure的布爾函數,你實際上可以在clojure中工作。
(boolean (Boolean/valueOf "true")) ;;true
(boolean (Boolean/valueOf "false")) ;;false
如果您必須將字符串視爲布爾值,則read-string
是合理的選擇。但如果你知道的投入將是一個結構良好的布爾(即,「真」或「假」),你可以使用使用set #{"true"}
作爲一個函數:
(def truthy? #{"true"})
(if (truthy? x)
...)
或者,如果你想對待任何字符串,但「假」爲truthy(Clojure的大概是如何看待上的任何感實性),可以使用(complement #{"false"})
:
(def truthy? (complement #{"false"}))
(if (truthy? x)
...)
如果你想要做的沒什麼兩樣了,因爲PHP的弱類型轉換的東西,你會必須自己寫規則。
您應該總是考慮將代碼轉換爲明確命名的函數。這使您能夠在代碼中更具描述性,並且還允許您在以後需要時更改實現(例如,如果您確定其他字符串也應該算作真理)。
我建議是這樣的:
(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
*不要做這個*。總是使用'Boolean'構造函數總是一個錯誤;它甚至不應該存在。相反,使用'(Boolean/valueOf x)'。 – amalloy 2012-08-08 06:41:12
你是什麼意思這總是一個錯誤? – smunk 2012-08-08 06:42:34
請參閱http://docs.oracle.com/javase/6/docs/api/java/lang/Boolean.html#Boolean(boolean),瞭解網站上爲什麼不應該這樣做的衆多解釋之一。或谷歌的'Java布爾構造函數'看到討論。 **編輯**實際上,鏈接的javadoc暗示空間/速度是原因;你最好使用谷歌搜索,看看爲什麼它的語義錯誤。 – amalloy 2012-08-08 06:43:26