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 !( { }())


Modified text is an extract of the original Stack Overflow Documentation
Licentie onder CC BY-SA 3.0
Niet aangesloten bij Stack Overflow