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.