2012-08-08 8 views
5

をブール値への文字列をキャストするためにどのように私は、次のしている文 - 作業Clojureの

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

結果である - 作業

どちらの時間結果がどのように、同じです私は適切に文字列をブール値にブーストします。あなたは、文字列を受け入れる方法を持つ新しいJavaのBooleanオブジェクトを作成することができますread-string

(if (read-string "false") (println "working") (println "not working")) 

答えて

2

。 clojureのブール関数を使用すると、実際にclojureで機能するようになります。

(boolean (Boolean/valueOf "true")) ;;true 
(boolean (Boolean/valueOf "false")) ;;false 
9

を使用して

+7

* *これを行うことはありません。 'ブール'コンストラクタを使うことは常にエラーです。それは存在すべきではありません。代わりに、 '(Boolean/valueOf x)'を使用します。 – amalloy

+0

それはいつもそれは間違いであることを意味するか。 – smunk

+3

Web上の多くの説明の1つは、なぜそれをしてはいけないのかについてhttp://docs.oracle.com/javase/6/docs/api/java/lang/Boolean.html#Boolean(boolean)を参照してください。または、 'java boolean constructor'のためのgoogleを使って議論を見てください。 ** edit **実際にリンクされたjavadocは、スペース/スピードが理由であることを意味します。あなたはグーグル・グーグルではなく、それがなぜ意味的に間違っているのかを知ることができます。 – amalloy

11

あなたはブール値として文字列を扱う必要がある場合は、read-stringは合理的な選択です。しかし、あなたが入力が整形式ブール(すなわち、「true」または「false」)になります知っていれば、あなただけの関数としてセット#{"true"}を使用使用することができます。

したい場合は
(def truthy? #{"true"}) 
(if (truthy? x) 
    ...) 

あるいは、任意の文字列を処理することが、「偽」truthy(Clojureのは何のtruthinessを見ておおよそどのように)として、あなたは(complement #{"false"})使用することができます。

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

を使用すると、PHPの弱い型付けの変換のように下劣な何かをしたい場合は、あなたがよ自分でルールを書く必要があります。

+2

'='だけ使うことができるときにはどうして設定されますか?例: '(def truthy?(partial =" true "))' – Ankur

+3

ちょうどより涼しいです。それ以上の理由はない。 – amalloy

2

この種の変換を明確に名前付きの関数にするには、コードをラップすることを常に考慮する必要があります。これにより、コードの記述性を高めることができます。また、後で必要に応じて実装を変更することもできます(たとえば、真実と数える必要がある他の文字列を識別する場合など)。

私のようなものをお勧めしたい:あなたのテストケースにこれを適用する

(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