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.