我有以下陈述
(if "true" (println "working") (println "not working"))
结果是 - 工作
(if "false" (println "working") (println "not working"))
结果是 - 工作
两者的时间结果都是一样的,如何正确地将字符串转换为 clojure 中的布尔值。
您可以创建一个新的 java Boolean 对象,该对象有一个接受字符串的方法。如果你然后使用 clojure 的布尔函数,你实际上可以让它在 clojure 中工作。
(boolean (Boolean/valueOf "true")) ;;true
(boolean (Boolean/valueOf "false")) ;;false
如果必须将字符串视为布尔值,read-string
是一个合理的选择。但是,如果您知道输入将是一个格式良好的布尔值(即“true”或“false”),您可以将集合#{"true"}
用作函数:
(def truthy? #{"true"})
(if (truthy? x)
...)
或者,如果您想将除 "false" 之外的任何字符串视为真实(大致是 Clojure 如何看待任何事物的真实性),您可以使用(complement #{"false"})
:
(def truthy? (complement #{"false"}))
(if (truthy? x)
...)
如果你想做一些像 PHP 的弱类型转换这样卑鄙的事情,你必须自己编写规则。
使用read-string
(if (read-string "false") (println "working") (println "not working"))
您应该始终考虑包装代码以将这种转换为明确命名的函数。这使您可以在代码中更具描述性,并且还允许您在以后需要时更改实现(例如,如果您确定其他字符串也应该被视为真实)。
我建议像:
(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