私は次の声明を持っています
(if "true" (println "working") (println "not working"))
結果は - 働いています
(if "false" (println "working") (println "not working"))
結果は - 働いています
両方の時間結果は同じです。どうすれば、clojure で文字列をブール値に正しくキャストできますか。
文字列を受け入れるメソッドを持つ新しいjavaブールオブジェクトを作成できます。その後、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