6

我有以下陈述

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

结果是 - 工作

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

结果是 - 工作

两者的时间结果都是一样的,如何正确地将字符串转换为 clojure 中的布尔值。

4

4 回答 4

13

您可以创建一个新的 java Boolean 对象,该对象有一个接受字符串的方法。如果你然后使用 clojure 的布尔函数,你实际上可以让它在 clojure 中工作。

(boolean (Boolean/valueOf "true")) ;;true
(boolean (Boolean/valueOf "false")) ;;false 
于 2012-08-08T06:32:55.647 回答
12

如果必须将字符串视为布尔值,read-string是一个合理的选择。但是,如果您知道输入将是一个格式良好的布尔值(即“true”或“false”),您可以将集合#{"true"}用作函数:

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

或者,如果您想将除 "false" 之外的任何字符串视为真实(大致是 Clojure 如何看待任何事物的真实性),您可以使用(complement #{"false"})

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

如果你想做一些像 PHP 的弱类型转换这样卑鄙的事情,你必须自己编写规则。

于 2012-08-08T06:40:20.053 回答
5

使用read-string

(if (read-string "false")  (println "working") (println "not working"))
于 2012-08-08T06:31:51.813 回答
3

您应该始终考虑包装代码以将这种转换为明确命名的函数。这使您可以在代码中更具描述性,并且还允许您在以后需要时更改实现(例如,如果您确定其他字符串也应该被视为真实)。

我建议像:

(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
于 2012-08-08T09:21:01.693 回答