2012-01-19 12 views

答えて

31

これら

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というコンストラクタとの一貫性とユーティリティの選択肢から、私は彼らが後者を選択するのは正しいと思います。

+3

私はあなたが "両方のこれらの"前に2つの偽の例を示すことを意味したと思います – ataylor

+0

@ataylor訂正のおかげで、私は答えを更新しました –

1

ブールコンストラクタは、指定した文字列を受け取り、その文字列に対してtoBoolean()メソッドを実行しています。つまり、は、有効なブール値としてを解析できないため、falseとして扱われます。あるいは、言い換えれば、「真実」だけが真実です。

0

コンストラクタに関する@ cdeszaqのポイントに同意する傾向があります。最初の例が確認されている限り、私はそれをブールにキャストしているだけです。ポインタがnullでない限り、それは真です。私は.toBoolean()がそのオブジェクト値を実際に解析しようとしていると思います。彼らが返すものを見るには'true'.toBoolean()'1'.toBoolean()を実行することを検討してください。

私はこの質問の前にGroovyについて聞いたことがありませんが、これはすべて間違っている可能性があります。

+1

'1' .toBoolean()はtrueを返します。ここでテストすることができます:http://groovyconsole.appspot.com/ – Raphael

+0

乾杯、役に立つリンク! +1 –

16

ドンは、右のようである:

'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() 
0

他のオブジェクトに適用された場合しかし、矛盾が生じ:

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)を使用して非ヌル整数をチェックすることをトレースすることができます。

関連する問題