groovy
素敵な真実(真実)
サーチ…
備考
Groovyは、 if 、 while 、 forのステートメントをJavaが標準のJavaの条件と同じように評価します。Javaでは 、ブール式(ブール値に評価される式)を指定する必要があり、結果は評価の結果です。
Groovyでは、結果はJavaの場合と同じです(例は提供されていませんが、これは標準のJavaです)。
例で示された他の真実性評価メカニズムは、次のように要約できます。
- numbers:ゼロ値はfalse、ゼロ以外はtrueと評価されます。
- オブジェクト:nullオブジェクト参照はfalseに評価され、true以外のnull参照は評価されません。
- 文字:0の値を持つ文字は偽と評価され、そうでない場合はtrueと評価されます。
- 文字列:文字列は、nullでなく空でない場合はtrue、nullまたは空の場合はfalse(GStringsおよびCharSequencesにも適用されます)と評価されます。
- コレクションとマップ(サブクラスList 、 Map 、 Set 、 HashSet ...を含む):また、サイズを考慮に入れ、コレクションがnullで空でない場合はtrue、nullまたは空の場合はfalseと評価されます。
- 列挙型と反復子は、nullでない場合にtrueと評価され、それらはさらにいくつかの要素です(groovyはオブジェクトにhasMoreElementsまたはhasNextを評価します)。
- Matcher:マッチャーは、少なくとも1つのマッチがある場合はtrueに、一致しない場合はfalseに評価します。
- クロージャ:クロージャは、クロージャによって返された結果の評価を評価します。
カスタムブール評価を提供するために、asBooleanメソッドをユーザー定義クラスでオーバーライドすることができます。
数値ブール評価
数値の場合、ゼロ値は偽、ゼロ以外は真
int i = 0
...
if (i)
print "some ${i}"
else
print "nothing"
"何も印刷されません"
文字列ブール評価
文字列(GStringを含む)は、nullでなく空でない場合はtrueに評価され、nullまたは空の場合はfalse
def s = ''
...
if (s)
println 's is not empty'
else
println 's is empty'
's is empty'と表示されます。
コレクションとマップブール評価
コレクションおよびマップは、nullでなく空でない場合はtrue、nullまたは空の場合はfalseと評価されます。
/* an empty map example*/
def userInfo = [:]
if (!userInfo)
userInfo << ['user': 'Groot', 'species' : 'unknown' ]
userInfoマップが空であるため、デフォルトのuserInfoとしてuser: 'Groot' , species : 'unknown'
を追加しuser: 'Groot' , species : 'unknown'
(マップはここではnullではありません)
ヌルオブジェクトの場合、コードは軽く、私たちが代入を行う必要があるため、userInfoで<<を呼び出すことはできません(オブジェクトブール評価も参照してください)。
/* an example with a null object (def does not implies Map type) */
def userInfo = null
if (!userInfo)
userInfo = ['user': 'Groot', 'species' : 'unknown' ]
ヌルマップの場合:
/* The same example with a null Map */
Map<String,String> userInfo = null
if (!userInfo)
userInfo = ['user': 'Groot', 'species' : 'unknown' ]
オブジェクトブール評価
nullのオブジェクト参照はfalseに評価され、true以外の参照はNULLになりますが、文字列、コレクション、イテレータおよび列挙ではサイズも考慮されます。
def m = null
if (!m)
println "empty"
else
println "${m}"
"空"と表示されます
def m = [:]
if (!m)
println "empty"
else
println "${m}"
マップはnullではなく空ですが、このコードは "空"を出力します。
やった後
m << ['user' : 'Groot' ]
マップを印刷します:
[user:Groot]
ユーザー定義クラスのブール評価のオーバーライド
場合によっては、ある種のオブジェクトのために独自のプログラムに特定のasBoolean定義を持たせると便利かもしれません。
/** an oversimplified robot controller */
class RunController {
def complexCondition
int position = 0
def asBoolean() {
return complexCondition(this);
}
def advanceTo(step) {
position += step
}
}
def runController = new RunController(complexCondition : { c -> c.position < 10 } )
assert runController
runController.advanceTo(5)
assert runController
runController.advanceTo(5)
// The limit has been reached : the controller evaluates to false
assert !runController
このコードは、ロボットの位置が10を超えていないことを確認する過度に単純化されたロボットコントローラを示しています(条件評価用のクロージャ付き)
文字の評価
Characterは、値がゼロでない場合はtrue、ゼロの場合はfalseと評価されます。
assert ! new Character((char)0)
assert ! new Character('\u0000Hello Zero Char'.charAt(0))
assert new Character('Hello'.charAt(0))
マッチャ評価
Matcherは少なくとも1つの一致を見つけることができる場合はtrueを、一致が見つからない場合はfalseを返します
// a match is found => true
assert 'foo' =~ /[a-z]/
// the regexp does not match fully => no match => false
assert !( 'foo' ==~ /[a-z]/ )
// a match is found => true
assert 'foo' =~ /o/
// no match => false
assert !( 'foo' =~ /[A-Z]/ )
クロージャ評価
クロージャの評価は、クロージャの結果の評価です。
すべてのルールが適用されます。クロージャがnull、ゼロ数または空のString、Collection、MapまたはArrayを返す場合はfalseに、それ以外の場合はtrueに評価されます。
// Closure return non zero number => true
assert { 42 }()
// closure returns 0 => false
assert ! ( { 0 }())
// closure returns null => false
assert !( { }())