4. Vezérlési szerkezetek
A Groovy támogatja az összes Javában megismert vezérlési szerkezetet. Ezen felül a closureok miatt a felhasználó is tetszőleges vezérlési szerkezetet megvalósíthat. Ennek szellemében a Collection típusú objektumok támogatnak jópár nagyon kényelmes iterálási módot.
Üres utasítás
Groovyban nincs kifejezetten üres utasítás, így csak közvetetten írhatunk olyat.
Üres utasítás, mint üres blokk:
{}
Pontosvesszőt, mint üres blokk:
;
Értékadás
Értékadás az = operátorral. Speciális esetekben pl. kollekcióknál a setAt()...
A nyelv dinamikus / statikus típusossága miatt, ha egy változónak nincs meghatározva a statikus típusa, akkor bármi értékül adható neki, ha meghatározott a statikus típusa, akkor csak akkor érvényes az értékadás, ha létezik konverzió a két típus között.
Szekvencia
A pontosvessző szekvenciák határánál lehet, de nem kötelező kitenni.
Elágazások
if{} [else if{}]* [else{}]? ismert szintaxis.
Ciklus
A hagyományos ciklus szintaxisa mellett
for (int i=0; i < len; i++) {...}
használhatók a következők is:
for (i in 0..len-1) {...}
for (i in 0..
len.times {...}
Switch
Vezérlési szerkezetek közül a switch
különösen erős a rubyhoz hasonló szemantikát kapott. A Groovy beli switch visszafelé kompatibilis a Javas switchel. A különbség abban áll, hogy
tetszőleges objektum lehet a switch értéke, és több féle illesztési módszer van a minta típusa alapján.
- Class típusú illesztési érték esetén az objektumot az instanceof operátorral hasonlítja.
- Reguláris kifejezések esetén illeszteni próbálja a string típusú objektumot.
- Collection típusú illesztési érték esetén tartalmazást vizsgál.
- Ha a fönti esetek közül egyik sem áll fenn, akkor az illesztési érték equals() függvénye alapján dönt.
def x = 1.23
def result = ""
switch ( x ) {
case "foo":
result = "found foo"
// lets fall through
case "bar":
result += "bar"
case [4, 5, 6, 'inList']:
result = "list"
break
case 12..30:
result = "range"
break
case Integer:
result = "integer"
break
case Number:
result = "number"
break
default:
result = "default"
}
assert result == "number"
A case utasítás az illeszkedést a case érték isCase(switchValue) metódusa alapján végzi, ami alapértelmezésben egy equals(switchValue) hívásnak felel meg, de felül lett
definiálva a fent említett típusokra. Ebből következik, hogy a felhasználó is felüldefiniálhatja az általa illeszteni kívánt osztályokban az isCase() metódust,
hogy a saját illesztéseit megvalósítsa.
Blokkok
Groovyban is létrehozhatunk blokkokat, a try{ ... } segítségével. Az ezen belül definiált változók a blokkon kívül nem láthatók.
Viszont a 'def' kulcsszó használata nem kötelező. Ha nem használjuk a 'def'-et változó nevének definiálásakor, akkor az a változó a blokkon kívül is látható marad.
példák:
def a = 'good morning'
try{
def b = 'greetings', c = 'nice day'
//'def' kulcsszó 'b'-re és 'c'-re is vonatkozik
assert a == 'good morning'
assert b == 'greetings'
d = 6
assert d == 6 //def kulcsszó opcionális
}
assert a == 'good morning'
//println b //ez fordítási hiba lenne: b nem látható itt
assert d == 6 //a blokkon kívül is látható
Természetesen a látható változó neveit nem definiálhatjuk újra.
Blokkok egymásba ágyazhatóak:
def a = 123
try{
try{
try{
assert a == 123
}
}
}