Vrste gudača u Groovyu

1. Pregled

U ovom vodiču pobliže ćemo pogledati nekoliko vrsta žica u Groovyju, uključujući jednocitirane, dvostruke, trostruke i cjelokupne žice.

Istražit ćemo i podršku za niz znakova Groovyja za posebne znakove, višeredne linije, regularni izraz, izbjegavanje i varijabilnu interpolaciju.

2. Poboljšanje java.lang.String

Vjerojatno je dobro započeti izjavom da, budući da se Groovy temelji na Javi, ima sve Java Niz mogućnosti poput spajanja, String API-ja i inherentnih blagodati konstantnog spremišta String zbog toga.

Prvo da vidimo kako Groovy proširuje neke od ovih osnova.

2.1. Spajanje nizova

Spajanje nizova samo je kombinacija dva niza:

def first = 'first' def second = "second" def concatenation = first + second assertEquals ('firstsecond', concatenation)

Groovy se na tome nadovezuje sa svojih nekoliko drugih vrsta žica, koje ćemo pogledati za trenutak. Imajte na umu da svaki tip možemo međusobno povezati.

2.2. Interpolacija niza

Sada Java nudi nekoliko vrlo osnovnih predložaka printf, ali Groovy ide dublje, nudeći interpolacija niza, postupak predložaka nizova s ​​varijablama:

def name = "Kacper" def result = "Pozdrav $ {name}!" assertEquals ("Zdravo Kacper!", result.toString ())

Iako Groovy podržava spajanje svih svojih vrsta nizova, pruža samo interpolaciju za određene tipove.

2.3. GString

Ali u ovom se primjeru krije mala bora - zašto zovemo toString ()?

Zapravo, proizlaziti nije tipa Niz, čak i ako to izgleda tako.

Jer Niz razred je konačni, Groovyjeva klasa nizova koja podržava interpolaciju, GString, ne podrazvrstava ga. Drugim riječima, da bi Groovy pružio ovo poboljšanje, ima vlastitu klasu nizova, GString, koja se ne može proširiti od Niz.

Jednostavno rečeno, ako jesmo:

assertEquals ("Zdravo Kacper!", rezultat)

ovo se poziva assertEquals (objekt, objekt), i dobivamo:

java.lang.AssertionError: očekuje se: java.lang.String, ali bio je: org.codehaus.groovy.runtime.GStringImpl Očekivano: java.lang.String Stvarno: org.codehaus.groovy.runtime.GStringImpl

3. Jednocitirani niz

Vjerojatno je najjednostavniji niz u Groovyu onaj s jednostrukim navodnicima:

def primjer = 'Pozdrav svijetu'

Ispod haube ovo su obične stare Java Žice, i dobro dođu kada trebamo imati citate unutar svog niza.

Umjesto:

def hardToRead = "Kacper voli \" Gospodara prstenova \ ""

Jednostavno možemo povezati jedan niz s drugim:

def easyToRead = 'Kacper voli "Gospodara prstenova"'

Budući da možemo mijenjati vrste citata poput ove, to smanjuje potrebu za bijegom od citata.

4. Trostruki niz s jednim citatom

Trostruki niz s jednim navodnikom koristan je u kontekstu definiranja sadržaja s više redaka.

Na primjer, recimo da ih imamo JSON predstaviti kao niz:

{"name": "John", "age": 20, "birthDate": null}

Ne trebamo pribjegavati spajanju i eksplicitnim znakovima novog retka da bi to predstavljali.

Umjesto toga, upotrijebimo trostruki niz s jednim navodnikom:

def jsonContent = '' '{"ime": "Ivan", "dob": 20, "datum rođenja": null}' ''

Groovy ovo pohranjuje kao jednostavnu Java Nizi dodaje nam potrebno spajanje i nove redove.

Ipak, jedan je izazov koji treba prevladati.

Uobičajeno zbog čitljivosti koda uvlačimo naš kod:

def triple = '' 'firstline secondline' ''

Ali trostruki citati s jednim navodnikom čuvaju razmak. To znači da je gornji niz stvarno:

(novi red) prvi red (novi red) drugi red (novi red)

ne:

1 2 prva linija (nova linija)druga linija (nova linija)

kao što smo možda i namjeravali.

Pratite nas da vidimo kako ćemo ih se riješiti.

4.1. Lik novog reda

Potvrdimo to naš prethodni niz započinje znakom novog retka:

assertTrue (triple.startsWith ("\ n"))

Moguće je skinuti taj lik. Da bismo to spriječili, moramo staviti jednu kosu crtu \ kao prvi i posljednji lik:

def triple = '' '\ firstline secondline' ''

Sad barem imamo:

1 2 prva linija (nova linija)druga linija (nova linija)

Jedan problem, još jedan.

4.2. Skinite udubljenje koda

Dalje, pobrinimo se za udubljenje. Želimo zadržati oblikovanje, ali ukloniti nepotrebne razmake.

U pomoć dolazi Groovy String API!

Da bismo uklonili vodeće razmake u svakom retku našeg niza, možemo koristiti jednu od zadanih metoda Groovy, Niz # stripIndent ():

def triple = '' '\ firstline secondline' ''. stripIndent () assertEquals ("firstline \ nsecondline", triple)

Imajte na umu da pomicanjem krpelja prema liniji, uklonili smo i prateći znak novog retka.

4.3. Relativno udubljenje

To bismo se trebali sjetiti stripIndent se ne zove stripWhitespace.

stripIndent određuje količinu uvlačenja iz skraćene crte koja nije razmak u nizu.

Dakle, promijenimo udubljenje prilično za naše utrostručiti varijabla:

klasa TripleSingleQuotedString {@Test void 'trostruki pojedinačni navod sa višerednim nizom sa zadnjim retkom samo s razmacima' () {def triple = '' '\ firstline secondline \' '' .stripIndent () // ... use triple}}

Ispis utrostručiti bi nam pokazao:

firstline secondline

Od prvi red je najmanje razvedena linija koja nije razmak, postaje nula uvučena s druga linija još uvijek uvučen u odnosu na njega.

Također imajte na umu da ovoga puta uklanjamo razmake koji slijede kosom crtom, kao što smo vidjeli ranije.

4.4. Traka sa stripMargin ()

Za još veću kontrolu Groovyju možemo reći točno gdje treba započeti liniju pomoću | i stripMargin:

def triple = '' '\ | prva linija | druga linija' ''. stripMargin ()

Koji bi prikazali:

firstline secondline

Linija navodi gdje ta linija niza stvarno započinje.

Također, možemo proći a Lik ili CharSequence kao argument za stripMargin s našim prilagođenim znakom graničnika.

Izvrsno, riješili smo se svih nepotrebnih razmaka, a naš niz sadrži samo ono što želimo!

4.5. Bijeg od posebnih znakova

Uz sve prednosti trostrukog niza s jednostrukim navodnicima, prirodna je posljedica potrebe za bijegom od pojedinačnih navodnika i nagnutih crtica koje su dio našeg niza.

Da bismo predstavljali posebne znakove, trebamo im pobjeći i kosom crtom. Najčešći posebni znakovi su novi red (\ n) i tabeliranje (\ t).

Na primjer:

def specialCharacters = '' 'bok \' John \ '. Ovo je kosa crta - \ \ nDruga crta počinje ovdje '' '

rezultirat će:

pozdrav 'John'. Ovo je kosa crta - \ Drugi redak započinje ovdje

Moramo se sjetiti nekoliko, naime:

  • \ t - tabeliranje
  • \ n - nova linija
  • \ b - backspace
  • \ r - povrat prtljage
  • \\ - kosa crta
  • \ f - ulaganje obrasca
  • \' - jedan navodnik

5. Niz s dvostrukim navodnicima

Iako su nizovi s dvostrukim navodnicima također samo Java Žice, njihova posebna snaga je interpolacija. Kada niz s dvostrukim navodnicima sadrži interpolacijske znakove, Groovy isključuje Javu Niz za GString.

5.1.GString i lijena procjena

Dvostruko citirani niz možemo interpolirati okolnim izrazima s ${} ili sa $ za točkaste izraze.

Njegova je ocjena lijena, ipak - neće se pretvoriti u Niz dok se ne prenese na metodu koja zahtijeva a Niz:

def string = "example" def stringWithExpression = "example $ {2}" assertTrue (string instanceof String) assertTrue (stringWithExpression instanceof GString) assertTrue (stringWithExpression.toString () instanceof String)

5.2. Rezervirano mjesto s referencom na varijablu

Prvo što vjerojatno želimo učiniti s interpolacijom je slanje reference s varijablama:

def name = "John" def helloName = "Pozdrav $ ime!" assertEquals ("Zdravo John!", helloName.toString ())

5.2. Rezervirano mjesto s izrazom

Ali, možemo mu dati i izraze:

def rezultat = "rezultat je $ {2 * 2}" assertEquals ("rezultat je 4", result.toString ())

Možemo čak i izjave staviti u rezervirana mjesta, ali to se smatra lošom praksom.

5.3. Rezervisari s Dot Operatorom

Čak možemo hodati hijerarhijom objekata u našim nizovima:

def person = [name: 'John'] def myNameIs = "Ja sam $ person.name, a ti?" assertEquals ("Ja sam John, a ti?", myNameIs.toString ())

S geterima Groovy obično može zaključiti naziv svojstva.

Ali ako metodu izravno pozovemo, morat ćemo je koristiti ${}zbog zagrada:

def name = 'John' def result = "Veliko slovo: $ {name.toUpperCase ()}". toString () assertEquals ("Veliko slovo: JOHN", rezultat)

5.4. hashCode u GString i Niz

Interpolirane žice sigurno su božji dar u usporedbi s običnim java.util.String, ali razlikuju se na važan način.

Vidi, Java Žice su nepromjenjivi i tako pozivaju hashCode na danom nizu uvijek vraća istu vrijednost.

Ali, GString hash kodovi mogu se razlikovati od Niz prikaz ovisi o interpoliranim vrijednostima.

I zapravo, čak i za isti rezultirajući niz, oni neće imati iste hash kodove:

def string = "2 + 2 je 4" def gstring = "2 + 2 je $ {4}" assertTrue (string.hashCode ()! = gstring.hashCode ())

Stoga, nikada ne bismo trebali koristiti GString kao ključ u a Karta!

6. Trostruki niz dvostrukih citata

Dakle, vidjeli smo trostruke nizove s jednim navodnikom i vidjeli smo dvostruke navodnike.

Kombinirajmo snagu oba kako bismo dobili najbolje od oba svijeta - interpolacija više linija:

def name = "John" def multiLine = "" "Ja sam $ name." Ovo je citat iz "Rata i mira" "" ""

Također, primijetite to nismo morali pobjeći jednostrukim ili dvostrukim navodnicima!

7. Kosi niz

Recimo sada da radimo nešto s regularnim izrazom i tako izbjegavamo povratne kose crte svugdje:

def pattern = "\ d {1,3} \ s \ w + \ s \ w + \\ w +"

To je očito nered.

Da biste pomogli u ovome, Groovy izvorno podržava regularni izraz putem kosih nizova:

def pattern = / \ d {3} \ s \ w + \ s \ w + \ w + / assertTrue ("3 Blind Mice \ Men" .odgovara (uzorak))

Kosa žica mogu biti interpolirani i višeredni:

def name = 'John' def primjer = / Dragi ([A-Z] +), Ljubavi, $ name /

Naravno, moramo izbjeći kose crte:

def pattern = /.*foobar.*\/ hello.*/ 

I ne možemo predstavljati prazan niz s Neugodna žicabudući da sastavljač razumije // kao komentar:

// if ('' == //) {// println ("Ne mogu kompajlirati") //}

8. Dollar-Slashy string

Kosa žica je sjajna, mada je grozno morati pobjeći od kose crte. Da bismo izbjegli dodatno izbjegavanje kose crte prema naprijed, možemo upotrijebiti kosi dolar.

Pretpostavimo da imamo obrazac regularnog izraza: [0-3]+/[0-3]+. Dobar je kandidat za dolasani niz jer bismo u slijepom nizu morali napisati: [0-3]+//[0-3]+.

Dollar-slesh nizovi su višeredni GStrings koje se otvaraju s $ / i zatvaraju s / $. Da bismo izbjegli kosinu dolara ili naprijed, možemo joj ispred oznake dolar ($), ali to nije potrebno.

Ne trebamo pobjeći $ GString rezerviranog mjesta.

Na primjer:

def name = "John" def dollarSlashy = $ / Hello $ name !, mogu vam pokazati znak $ ili znak za bijeg dolara: $$ Obje kose crte rade: \ ili /, ali još uvijek možemo pobjeći: $ / Imamo kako bi se izbjeglo otvaranje i zatvaranje graničnika: - $$$ / - $ / $$ / $ 

bi izlaz:

Pozdrav John !, mogu vam pokazati znak $ ili znak bijega dolara: $ Obje kose crte rade: \ ili /, ali još uvijek možemo pobjeći od njega: / Moramo pobjeći od otvaranja i zatvaranja graničnika: - $ / - / $

9. Karakter

Oni koji su upoznati s Javom već su se pitali što je Groovy radio sa znakovima jer koristi jednostruke navodnike za nizove.

Zapravo, Groovy nema eksplicitni doslovni znak.

Tamo su tri načina napraviti a Groovy niz stvarnog znaka:

  • izričita upotreba ključne riječi 'char' prilikom deklariranja varijable
  • koristeći operator "kao"
  • lijevanjem na 'char'

Pogledajmo ih sve:

char a = 'A' char b = 'B' kao char char c = (char) 'C' assertTrue (instanceof Character) assertTrue (b instanceof Character) assertTrue (c instanceof Character)

Prvi je način vrlo prikladan kada želimo zadržati lik kao varijablu. Ostale dvije metode su zanimljivije kada želimo proslijediti znak kao argument funkciji.

10. Sažetak

Očito je to bilo puno, pa hajde da brzo sažmemo neke ključne točke:

  • nizovi stvoreni jednim navodnikom (‘) ne podržavaju interpolaciju
  • kosi i utrostručeni nizovi s dvostrukim navodnicima mogu biti višeredni
  • višeredni nizovi sadrže razmake zbog uvlačenja koda
  • kosa crta (\) koristi se za bijeg od posebnih znakova u svim vrstama, osim dolasakog niza, gdje moramo upotrijebiti dolar ($) za bijeg

11. Zaključak

U ovom smo članku razgovarali o mnogim načinima za stvaranje niza u Groovyju i njegovoj podršci za više linija, interpolaciju i regularni izraz.

Svi ovi isječci dostupni su na Githubu.

A za više informacija o značajkama samog jezika Groovy, započnite s našim uvodom u Groovy.