groovy
Groovy Truth (waarheidsgetrouwheid)
Zoeken…
Opmerkingen
Groovy evalueert voorwaarden in if , while en voor statements op dezelfde manier als Java doet voor standaard Java-voorwaarden : in Java moet u een booleaanse expressie opgeven (een expressie die evalueert naar een boolean) en het resultaat is het resultaat van de evaluatie.
In Groovy is het resultaat hetzelfde als in Java voor deze omstandigheden (geen voorbeelden gegeven, dit is standaard Java).
Het andere evaluatiemechanisme van waarheidsgetrouwheid dat wordt getoond door voorbeelden kan worden samengevat als:
- getallen: een nulwaarde resulteert in onwaar, niet nul in waar.
- objecten: een nulobjectreferentie resulteert in onwaar, een niet-nulverwijzing naar waar.
- Karakter: een karakter met een nulwaarde wordt als onwaar geëvalueerd, anders is dit waar.
- String: een string wordt geëvalueerd als true indien niet null en niet leeg, false als null of leeg (geldt ook voor GStrings en CharSequences).
- Collecties en kaarten (inclusief subklassen Lijst , Kaart , Set , HashSet ...): houdt ook rekening met de grootte, evalueert waar als de verzameling niet null is en niet leeg, vals als null of leeg.
- Opsommingen en Iterators worden geëvalueerd als waar, zo niet null en het zijn wat meer elementen (groovy evalueert hasMoreElements of hasNext op het object), onwaar als null of niet meer elementen.
- Matcher: een matcher evalueert waar als er ten minste één match is, false als er geen match is gevonden.
- Sluiting: een sluiting wordt geëvalueerd als evaluatie van het resultaat dat door de sluiting is geretourneerd.
De asBooleaanse methode kan worden overschreven in een door de gebruiker gedefinieerde klasse om aangepaste Booleaanse evaluatie te bieden.
Getallen booleaanse evaluatie
voor getallen wordt een nulwaarde geëvalueerd als onwaar, niet nul als waar
int i = 0
...
if (i)
print "some ${i}"
else
print "nothing"
zal "niets" afdrukken
Tekenreeksen booleaanse evaluatie
een string (inclusief GStrings) wordt geëvalueerd als true indien niet null en niet leeg, false als null of leeg
def s = ''
...
if (s)
println 's is not empty'
else
println 's is empty'
zal afdrukken: 's is leeg'
Collecties en kaarten booleaanse evaluatie
Collecties en kaarten worden geëvalueerd als waar, zo niet null en niet leeg en onwaar als null of leeg
/* an empty map example*/
def userInfo = [:]
if (!userInfo)
userInfo << ['user': 'Groot', 'species' : 'unknown' ]
voegt user: 'Groot' , species : 'unknown'
als standaard userInfo omdat de userInfo-kaart leeg is (merk op dat de kaart hier niet nul is)
Met een nul-object is de code enigszins anders, we kunnen geen << op userInfo aanroepen omdat het nul is, we moeten een opdracht maken (zie ook Object boolean-evaluatie):
/* an example with a null object (def does not implies Map type) */
def userInfo = null
if (!userInfo)
userInfo = ['user': 'Groot', 'species' : 'unknown' ]
En met een nulkaart:
/* The same example with a null Map */
Map<String,String> userInfo = null
if (!userInfo)
userInfo = ['user': 'Groot', 'species' : 'unknown' ]
Object Booleaanse evaluatie
een nulobjectreferentie evalueert als onwaar, een niet-nulverwijzing naar true, maar voor tekenreeksen, collecties, iterators en opsommingen houdt het ook rekening met de grootte.
def m = null
if (!m)
println "empty"
else
println "${m}"
zal "leeg" afdrukken
def m = [:]
if (!m)
println "empty"
else
println "${m}"
De kaart is niet leeg maar leeg, deze code drukt "leeg" af
Na het doen van
m << ['user' : 'Groot' ]
het zal de kaart afdrukken:
[user:Groot]
Booleaanse evaluatie overschrijven in een door de gebruiker gedefinieerde klasse
Soms kan het handig zijn om een specifieke asBooleaanse definitie in je eigen programma te hebben voor een soort objecten.
/** 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
Deze code toont een over-vereenvoudigde robotcontroller die controleert of de positie van de robot niet hoger is dan 10 (met een sluiting voor evaluatie van de toestand)
Karakter evaluatie
een teken wordt als waar geëvalueerd als de waarde niet nul is, onwaar als nul
assert ! new Character((char)0)
assert ! new Character('\u0000Hello Zero Char'.charAt(0))
assert new Character('Hello'.charAt(0))
Matcher evaluatie
een Matcher evalueert waar als het ten minste één match kan vinden, false als er geen match wordt gevonden
// 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]/ )
Sluiting evaluatie
De evaluatie van een sluiting is de evaluatie van het resultaat van de sluiting.
Alle regels zijn van toepassing: als de sluiting een nul, nul getal of lege string, verzameling, kaart of array retourneert, wordt deze als onwaar geëvalueerd, anders als waar.
// Closure return non zero number => true
assert { 42 }()
// closure returns 0 => false
assert ! ( { 0 }())
// closure returns null => false
assert !( { }())