def wzorzec = ".*c\$"Wynikiem działania operatora szukania jest java.util.regex.Matcher[][], zaś operatora wzorca java.util.regex.Pattern. Autorzy zwracają uwagę na operatory ~ oraz =~, ponieważ wystarczy zapomnieć o spacji i ze wzorca
def wzorzecJakWyzejAleProsciej = /.*c$/
def wzorzec = ~/.*c$/mamy operator szukania
"abc" =~ /.*c$/W jednym z przykładów można spotkać się z metodą tworzenia obiektów przypisując wartości polom przez nazwę.
class Osoba {Pamiętam podobną konstrukcję w C++, gdzie definiując konstruktor można było określić wartości domyślne dla pewnych pól instancji.
String imie
}
def jacek = new Osoba(imie: "Jacek")
Temat operatorów i możliwości ich przeciążania jest zamknięciem rozdziału 2. Przeciążanie operatorów nie jest dostępne w Javie, ale programiści C++ znają to nadzwyczaj dobrze. W Groovy definiujemy pewną ustaloną metodę, która będzie wykonywana przy wykonaniu operatora, np. dla a + b będzie to a.plus(b). Jeśli jej brak w naszej klasie będzie wykonywana domyślna obsługa operatora. Proste, nieprawdaż? Już nie pamiętam, aby tak prosto było w C++, ale na pierwszy rzut oka Groovy sprowadza temat przeciążania operatorów do banału. Dodanie elementu do listy to wykonanie lista.add(obiekt), albo, z wykorzystaniem przeciążania, lista << obiekt (co odpowiada wykonaniu metody lista.leftShift(obiekt)). Zdaje się, że ostatnie zdanie w sekcji Operator Overloading "Operator overloading isn't limited to..." sugeruje, że istnieje możliwość definiowania własnych operatorów, ale poza tą wzmianką nic więcej nie ma, więc przyjdzie mi dalej żyć w błogiej niewiedzy, czy mógłbym zdefiniować własny operator czy nie.
Groovy udostępnia kilka specjalizowanych operatorów - spread - *. (ang. spread operator), który jest uproszczeniem wykonania metody lub domknięcia na poszczególnych elementach kolekcji, które udostępniają wywoływaną metodę/domknięcie.
def lista = ["Agata", "Iweta", "Patryk", "Jacek"]Można go interpretować jako "wykonaj metodę/domknięcie na każdym elemencie listy".
lista.each { println it }
lista*.length()
Kolejnym operatorem jest Elvis - ?:, który jest uproszczonym operatorem warunkowym ?: znanym z Javy. W Javie mamy trzy składowe, podczas gdy w Groovy wyłącznie dwa i przypisanie wartości (wykonanie operatora Elvis) następuje wyłącznie, kiedy przypisywane pole ma wartość null lub false.
// jeśli osoba.imie jest null zmienna imieOsoby będzie miało wartość "Nieznane"Kolejny operator specjalny to operator bezpiecznego odczytu - ?., który zapobiega NPE (NullPointerException). Zamiast
def imieOsoby = osoba.imie ?: "Nieznane"
if (osoba != null) {wystarczy
println "${osoba.imie}"
}
println "${user?.imie}"Następny operator to operator bezpośredniego dostępu do pola z pominięciem wykonania metody odczytu (ang. getter) - .@, np.
class Osoba {Trudno uwierzyć mi, że może być zainteresowanie na tego typu konstrukcje, które łamią zasady programowania obiektowego - kapsułkowanie (ang. encapsulation) - ale skoro są, to powód ich powstania też musi być. To jest zaleta poznawania nowych języków - człowiek poznaje tym samym powody istnienia rzeczy, o których nie miał nawet pojęcia, że mogłyby istnieć. Nazwalibyśmy to osobistym rozwojem, czy zaśmiecaniem sobie głowy rzeczami, które są niewielkiej wartości?!
String imie
def getImie() {
imie + " (getImie)"
}
}
def jacek = new Osoba(imie: "Jacek")
println jacek.imie
println jacek.@imie
Ostatnim operatorem jest operator wykonania domknięcia - .&, który umożliwia potraktowanie dowolnej metody jako domknięcia, np.
String wyswietl(String tekst) {W ten sposób działa w Groovy println, który jest niczym innym jak wykonaniem javowego System.out.println.
println tekst
}
def laskowscy = ["Agata", "Jacek"]
laskowscy.each(this.&wyswietl)
Koniec rozdziału 2. "Groovy Basics".
p.s. Zgłosiłem blog do konkursu Blog Roku 2008. Zainteresowani wyrażeniem swojej bezgranicznej wdzięczności za literacką twórczość Jacka w jego Notatniku proszeni są o wysłanie SMSa o treści B00204 (czytaj: be-zero-zero-dwa-zero-cztery) pod numer 7144 za 1,22PLN brutto. Dziękuję!
Swoją drogą groovysh jest świetny do nauki podstaw :)
OdpowiedzUsuńhttp://toolsmatter.blogspot.com/2008/07/groovy-w-praktyce-part-1-instalacja-i.html
groovysh niekoniecznie. Lepszy groovyConsole. Jest o tym wzmianka w książce i nie raz doświadczyłem różnic między tymi środowiskami. Chodzi o widoczność obiektów/zmiennych, itp. groovyConsole traktuje wszystko jak jedną paczkę, podczas gdy groovysh już nie. Trudno mi to teraz wyjaśnić, bo za mało mam wiedzy praktycznej, ale proponowałbym do testów cięższy groovyConsole.
OdpowiedzUsuńp.s. Dzięki za linka do kolejnego bloga, który będę "śledził"!
Jak tylko się ustali w którym kraju piszę pracę magisterską to popchnę temat MDSD i pewnie DSLi. Postaram się coś wesołego wrzucić :)
OdpowiedzUsuńPięknie! Niektórym to się powodzi, aby wybierać, w którym kraju pisać pracę mgr ;-) Obowiązkowo opublikuj ją, kiedy skończysz, do publicznej konsumpcji.
OdpowiedzUsuń