:Groovy真実:文字列とブールの不一致? Groovyで
println 'test' as Boolean //true
println 'test'.toBoolean() //false
println new Boolean('test') //false
誰もが、この動作を明確にすることはできますか?
:Groovy真実:文字列とブールの不一致? Groovyで
println 'test' as Boolean //true
println 'test'.toBoolean() //false
println new Boolean('test') //false
誰もが、この動作を明確にすることはできますか?
これら
println 'test'.toBoolean() //false
println new Boolean('test') //false
の両方が、単一のString引数を取るコンストラクタを使用してjava.lang.Boolean
をインスタンス化します。 the javadocsによれば、ルールは次のとおり
文字列引数がnullでなく、「真」の文字列に、ケースを無視し、等しい場合は真の値を表すBooleanオブジェクトを割り当てます。それ以外の場合は、値falseを表すBooleanオブジェクトを割り当てます。
上記のどちらの場合も、Stringは 'true'(大文字と小文字は区別されません)に一致しないため、作成されるブール値はfalseです。コントラスト'test' as Boolean
ことで
はあなたが書くことを可能にする、coercion to a booleanのためのGroovy言語の規則に従います。文字列の
if ('hello') {
println 'this string is truthy'
}
、ルールは、それが空またはnullだ場合、それは偽と評価することをそれ以外の場合は事実です。
これは少し矛盾していると思われるかもしれませんが、java.lang.Boolean
というコンストラクタとの一貫性とユーティリティの選択肢から、私は彼らが後者を選択するのは正しいと思います。
ブールコンストラクタは、指定した文字列を受け取り、その文字列に対してtoBoolean()
メソッドを実行しています。つまり、は、有効なブール値としてを解析できないため、falseとして扱われます。あるいは、言い換えれば、「真実」だけが真実です。
コンストラクタに関する@ cdeszaqのポイントに同意する傾向があります。最初の例が確認されている限り、私はそれをブールにキャストしているだけです。ポインタがnullでない限り、それは真です。私は.toBoolean()
がそのオブジェクト値を実際に解析しようとしていると思います。彼らが返すものを見るには'true'.toBoolean()
と'1'.toBoolean()
を実行することを検討してください。
私はこの質問の前にGroovyについて聞いたことがありませんが、これはすべて間違っている可能性があります。
'1' .toBoolean()はtrueを返します。ここでテストすることができます:http://groovyconsole.appspot.com/ – Raphael
乾杯、役に立つリンク! +1 –
ドンは、右のようである:
'test' as Boolean
も "Groovyの真実" として知られているcoercion to a boolean
のためのGroovy言語の規則に従います。
しかしgroovyのString.toBoolean()
は、文字列を引数としてブール値を作成するだけではありません。 groovy api docs on String.toBoolean():
指定された文字列をブール型オブジェクトに変換します。トリムされた文字列が "true"、 "y"または "1"(大文字小文字を区別しない)の場合はtrue、そうでない場合はfalseです。
A few good examples for strings and their conversion with toBoolean():
assert "y".toBoolean()
assert 'TRUE'.toBoolean()
assert ' trUe '.toBoolean()
assert " y".toBoolean()
assert "1".toBoolean()
assert ! 'other'.toBoolean()
assert ! '0'.toBoolean()
assert ! 'no'.toBoolean()
assert ! ' FalSe'.toBoolean()
他のオブジェクトに適用された場合しかし、矛盾が生じ:
int i = 0
String s = 'abc'
if (s)
println 's is true' // will be printed
if (i)
println ' i "is true" ' // will not be printed
(Groovyの1.7.8)
あなたは、明示的でなければなりません2番目のif、if(i!= null)またはif(i!= 0)
いくつかのバグは、if(i)を使用して非ヌル整数をチェックすることをトレースすることができます。
私はあなたが "両方のこれらの"前に2つの偽の例を示すことを意味したと思います – ataylor
@ataylor訂正のおかげで、私は答えを更新しました –