Hlavní navigace

Groovy v příkladech: úvod do jazyka

Jakub Šťastný

V prvním díle našeho miniseriálku o Groovy se podíváme na základní datové struktury Groovy, na systém typování Groovy, na cykly, boolovské hodnoty a operátory, na komentáře, vyhodnocování proměnných v řetězcích a také na zápis víceřádkových řetězců. A co že to Groovy vlastně je? Jedná se o mladý skriptovací jazyk běžící pod JVM.

Typování v Groovy

Tipněte si, jak je typované Groovy :) Od skriptovacího jazyka se obecně očekává dynamické typování, které má i Groovy. Nelze však říci, že Groovy je dynamicky typovaný jazyk, protože Groovy umožňuje i statické typování. To mi přijde jako rozumný kompromis – deklarovat každou proměnnou je protivné, ale někdy se to prostě hodí. Více napoví následující příklad:

// dynamicky
year = 2007
year = "2007"  // OK

// dynamicky s def
def year = 2007
def year = "2007"  // výjimka org.codehaus.groovy.control.MultipleCompilationErrorsException

// staticky
int year = 2007
year = "2007"
year = 2008    // OK
year = "2007"  // výjimka org.codehaus.groovy.runtime.typehandling.GroovyCastException

Co se týče silného vs. slabého typování, Groovy je slabě typovaný jazyk. Někomu to může vyhovovat, ale dle mého názoru to bohužel omezuje vhodnost Groovy pro použití na větší projekty.

// integer + integer
print "5 + 5 = "
println 5 + 5

// string + string
print '"5" + "5" = '
println "5" + "5"

// integer + string
print '5 + "5" = '
println 5 + "5"

// string + integer
print '"5" + 5 = '
println "5" + 5

=> 5 + 5 = 10
=> "5" + "5" = 55
=> 5 + "5" = 55
=> "5" + 5 = 55

Datové typy v Groovy

Groovy je silně objektový jazyk. To, co v klasických programovacích jazycích stylu jazyka C rozumíme jako datové typy jsou v Groovy v zásadě instance objektů:

println "string".class
println 5.class
println 5.5.class
println 5000000000.class
println false.class
println true.class
println null.class
println [1, 2, "foo", new Date()].class

=> class java.lang.String
=> class java.lang.Integer
=> class java.math.BigDecimal
=> class java.lang.Long
=> class java.lang.Boolean
=> class java.lang.Boolean
=> java.lang.NullPointerException
=> class java.util.ArrayList

Zmíněnou ukázku není předpokládám třeba příliš vysvětlovat, metoda class vrací prostě třídu objektu. Přeskočíme čísla, jejichž použití je nad slunce jasné, a řekneme si pár vět k řetězcům.

Řetězce

V Groovy je možné psát víceřádkové řetězce, je však třeba je uvozovat třemi uvozovkami či apostrofy po obou stranách:

"jednořádkový řetězec"

"""
Víceřádkový
řetězec
"""

=> "jednořádkový řetězec"
=> "\nVíceřádkový\nřetězec\n"

Užitečnou možností je vyhodnocení proměnné uvnitř řetězce. To se dělá přiřazením znaku dolaru před jméno proměnné, funguje to však pouze v řetězcích, které jsou uvozeny uvozovkami a nikoliv apostrofy:

object = "pec"
println "$object nám spadla."  // řetězec uvozený uvozovkami
println '$object nám spadla.'  // řetězec uvozený apostrofy

=> pec nám spadla.
=> $object nám spadla.

Pokud se chystáme na nějaké divočejší kutění s proměnnou v řetězci, může se velmi hodit proměnnou a kód s ní spjatý uzavřít do složených závorek, aby Groovy poznalo, co je kód a co už je řetězec:

object = "pec"

println "${object.toUpperCase()} nám spadla."
println '${object.toUpperCase()} nám spadla.'

=> PEC nám spadla.
=> ${object.toUpperCase()} nám spadla.

Komentáře

Stejně jako v Javě Groovy používá dvě lomítka pro řádkový komentář a konstrukci /* */ pro komentář blokový. Klasický unixový komentář hashem nezná, s výjimkou #!/usr/bin/env groovy, které lze použít i v Groovy.

Standardní vstup a výstup

Pro výpis řetězce se stejně jako v mnoha dalších jazycích používá metoda print, pro výpis řetězce ukončený znakem konce řádku metoda println.

Booleovské hodnoty a operátory

V Groovy jsou k dispozici logické hodnoty true, false a null, které se používá pro prázdnou hodnotu. Z booleovských operátorů Groovy logické or ( ||), logické and ( &&) a samozřejmě negaci ( !). To těžko někoho z programátorů překvapí, spíše ale poznamenám, že zápisy výraz or výraz a výraz and výraz v Groovy použít nejdou.

Cykly v Groovy

Cykly jsou již mnohem zajímavější téma. Kromě klasických for, while a podobně má Groovy i cykly z Ruby, jako například kolekce.each { blok }, integer.times { blok } a další, které mi osobně přijdou syntakticky mnohem hezčí a čistší:

// syntakticky hezčí náhražka for cyklu
[1, 2, 3, 4, 5].each { print "$it-" }

// prochází
10.times { println "Iteration $it." }

=> 1-2-3-4-5-
=> Iteration 0.
=> Iteration 1.
=> Iteration 2.
=> Iteration 3.
=> Iteration 4.
=> Iteration 5.
=> Iteration 6.
=> Iteration 7.
=> Iteration 8.
=> Iteration 9.

Do proměnné it se automaticky přiřazují jednotlivé položky procházené kolekce. Pokud si místo it přejeme použít proměnnou námi voleného názvu, použijeme konstrukci { nase_promenna -> zbytek bloku }, například takto:

(1..10).each { number -> println number }

To je totéž, co bychom v Ruby bychom zapsali toto:

(1..10).each { |number| puts number }

A v Pythonu pro změnu:

for number in xrange(1, 10):
  print number

Příště

Tak, a to je pro dnešek vše. V příštím díle stále zůstaneme u vyložených základů Groovy – podíváme na objektový model Groovy, na tvorbu tříd a objektů, možností objektového programování a podobně. V dalších dílech pak plánuji probrat zajímavé projekty v Groovy, jako jsou Grails a Gant a v neposlední řadě také možnosti interakce s Javou.

Odkazy

Našli jste v článku chybu?

11. 12. 2007 10:16

Ratafak (neregistrovaný)
RTFM !

println 1.plus(1)

coz se cte *mnohem* vic 'objektove'!



10. 12. 2007 8:14

uživatel si přál zůstat v anonymitě
Sice se mi libi vyrazy
true.class
5.5.class
(ikdyz druhy pripad je trosku neprehledny), ale bohuzel vyraz
println 5 + 5
za objektovej povazovat nemuzu.
Měšec.cz: Exekuční poradna: ptejte se online

Exekuční poradna: ptejte se online

120na80.cz: Boreliózu nelze žádným testem prokázat

Boreliózu nelze žádným testem prokázat

DigiZone.cz: R2B2 a Hybrid uzavřely partnerství

R2B2 a Hybrid uzavřely partnerství

Měšec.cz: Za palivo zaplatíte mobilem (TEST)

Za palivo zaplatíte mobilem (TEST)

Root.cz: Certifikáty zadarmo jsou horší než za peníze?

Certifikáty zadarmo jsou horší než za peníze?

120na80.cz: Horní cesty dýchací. Zkuste fytofarmaka

Horní cesty dýchací. Zkuste fytofarmaka

Lupa.cz: Co se dá měřit přes Internet věcí

Co se dá měřit přes Internet věcí

Vitalia.cz: Test na HIV je zdarma i za pět set

Test na HIV je zdarma i za pět set

Měšec.cz: Jak vymáhat výživné zadarmo?

Jak vymáhat výživné zadarmo?

DigiZone.cz: Ohrozí Freedom TV přechodové sítě?

Ohrozí Freedom TV přechodové sítě?

Měšec.cz: Zdravotní a sociální pojištění 2017: Připlatíte

Zdravotní a sociální pojištění 2017: Připlatíte

Lupa.cz: Insolvenční řízení kvůli cookies? Vítejte v ČR

Insolvenční řízení kvůli cookies? Vítejte v ČR

Vitalia.cz: Potvrzeno: Pobyt v lese je skvělý na imunitu

Potvrzeno: Pobyt v lese je skvělý na imunitu

Podnikatel.cz: Podnikatelům dorazí varování od BSA

Podnikatelům dorazí varování od BSA

Lupa.cz: Kdo pochopí vtip, může jít do ČT vyvíjet weby

Kdo pochopí vtip, může jít do ČT vyvíjet weby

Vitalia.cz: Proč vás každý zubař posílá na dentální hygienu

Proč vás každý zubař posílá na dentální hygienu

Podnikatel.cz: Chtějte údaje k dani z nemovitostí do mailu

Chtějte údaje k dani z nemovitostí do mailu

Podnikatel.cz: E-Ježíšek si zařádí: nákupy od 2 do 5 tisíc

E-Ježíšek si zařádí: nákupy od 2 do 5 tisíc

Podnikatel.cz: Udávání a účtenková loterie, hloupá komedie

Udávání a účtenková loterie, hloupá komedie

DigiZone.cz: Česká televize mění schéma ČT :D

Česká televize mění schéma ČT :D