6

私は次の声明を持っています

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

結果は - 働いています

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

結果は - 働いています

両方の時間結果は同じです。どうすれば、clojure で文字列をブール値に正しくキャストできますか。

4

4 に答える 4

13

文字列を受け入れるメソッドを持つ新しいjavaブールオブジェクトを作成できます。その後、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 に答える