Pobierz prezentację
Pobieranie prezentacji. Proszę czekać
1
typy, operacje, sterowanie
Podstawy Groovy: typy, operacje, sterowanie © Krzysztof Barteczko, PJWSTK 1
2
Skrypty Cytaty: The Quiet Revolution:Open Source Scripting
Co to są skrypty i języki skryptowe ? Zastosowania: - programy uniwersalne - makra w systemach (aplikacjach) - integracja Integracja: - skrypty działające w ramach systemu - skrypty - łaczniki między różnymi aplikacjami - skrypty w Internecie i mashupy No hard-and-fast definition of what a scripting language is exists, but generally scripting languages are interpreted languages that feature higher productivity than more traditional systems languages. Perl, Python, REXX, Ruby, PHP, ... VBScript, WinScripting, AppleScripting Scripting languages are glue languages. They stitch together existing software, such as objects, components, widgets, operating system commands, programs, functions, and other forms of existing code. Scripting languages are higher-level than traditional programming languages because they more easily leverage existing software. Cytaty: The Quiet Revolution:Open Source Scripting by Howard Fosdick 2009 2
3
Groovy * is an agile and dynamic language for the Java Virtual Machine
* builds upon the strengths of Java but has additional power features inspired by languages like Python, Ruby and Smalltalk * supports Domain-Specific Languages and other compact syntax so your code becomes easy to read and maintain * makes writing shell and build scripts easy with its powerful processing primitives, OO abilities and an Ant DSL * increases developer productivity by reducing scaffolding code when developing web, GUI, database or console applications * seamlessly integrates with all existing Java objects and libraries * compiles straight to Java bytecode so you can use it anywhere you can use Java Cytat ze strony Groovy 3
4
Groovy Groovy = Java – "boiler plate code" + dynamiczne typowanie
+ dynamiczne wykonanie kodu (skryptowanie) + znacznie poszerzona funkcjonalność bibliotek + rozbudowane oraz modyfikowalne instrukcje sterujące + przeciążanie operatorów + przyjemna składnia dla kolekcji + domknięcia i elementy programowania funkcyjnego + latwe w użyciu parsery (XML/HTML, JSON) + rozbudowane rodzaje napisów i "templates" + wbudowane w składnię przetwarzanie wyr. regularnych + buildery (Swing, Ant, Html, Xml, JSON, Graphics ...) + metaprogramowanie fazy kompilacji i wykonania + doskonałe wsparcie do tworzenia DSL 4
5
Skrypty w języku Groovy
kod w jednym pliku źródłowym (lub jako napis w programie), nie ma potrzeby definiowania klas ani metod (ale można), nie ma potrzeby deklarowania zmiennych (ale można). Można łatwo pisać proste programy. Groovy: name = 'World' println "Hello $name" Java: public class Greeting { public static void main(String ... args) { String name = "World"; System.out.println("Hello " + name); } Średnik: w Groovy można pomijać, gdy w jednym wierszu jedna instrukcja. Nawiasy w wywołaniu metody/ funkcji: można pomijać, gdy są argumenty wywołania. 5
6
Porównanie: Java a Groovy
import java.util.*; public class PostfixFilter { public static List<String> getIdsFromListWithPostfix(List<String> list, String postfix) { List<String> result = new ArrayList<>(); for (String name : list) { if (name.endsWith(postfix)) result.add(name); } return result; public static void main(String[] args) { List<String> names = new ArrayList<>(); names.add("AWA Warszawa"); names.add("AKR Kraków"); names.add("AWR Wroclaw"); names.add("\"xxx\" Warszawa"); String loc = "Warszawa"; List<String> waw = getIdsFromListWithPostfix(names, loc); System.out.println("Znalezione dla " + loc + ": " + waw.size()); for (String name : waw) { String[] words = name.split(" +"); System.out.println(words[0]); names = [ 'AWA Warszawa', 'AKR Kraków','AWR Wroclaw', '"xxx" Warszawa'] loc = 'Warszawa' waw = names.findAll { it.endsWith loc } println "Znalezione dla $loc: " + waw.size() waw.each { println it.tokenize()[0] } 6
7
Przykład praktyczny: kursy euro
import groovy.swing.SwingBuilder def url = ' def rates = new XmlParser().parse(url) def map = [:] rates.Cube.Cube.Cube.each { = } new SwingBuilder().edt { frame(title: 'Euro rates', pack: true, visible: true) { panel() { comboBox(id: 'cb', border: titledBorder('Select currency'), prototypeDisplayValue: 'xxxxxxxxxxxxx', items: map.keySet().toList(), actionPerformed: { def cur = it.source.selectedItem lab.text = map[cur] }) label(id: 'lab', preferredSize: cb.preferredSize, border: titledBorder('Rate'))
8
Instalacja 1. JDK z java.sun.com - program instalacyjny prowadzi za rękę 2. Dokumentacja z java.sun.com - unzip 3. Groovy z groovy.codehaus.org - unzip 4. (opcjonalnie) Wybrane IDE 5. Ustawić zmienne środowiskowe PATH, JAVA_HOME i GROOVY_HOME 6. Test: Zapisać program w pliku Start.groovy: println "I'm Groovy!" Z wiersza poleceń: groovy Start.groovy Na konsoli uzyskamy napis: I’m Groovy! 8 8
9
Praca z Eclipse Eclipse pobrać można ze strony eclipse.org. Pobrane archiwum wystarczy rozpakować na dysku. Należy też doinstalować plug-in dla języka Groovy (“Software updates”). Na starcie Eclipse wybieramy Workspace - czyli obszar roboczy. Jest to wybrany przez nas katalog, w którym będą nasze programy. Workspace zawiera projekty. Programy umieszczane są w projektach. Zatem sekwencja działań jest następująca: * uruchomić Eclipse, * wybrać Workspace, * utworzyć nowy projekt (”Groovy project"), * w danym projekcie utworzyć program (”Groovy class"). 9
10
Znaki - kodowanie Unicode
Literały Literały liczbowe: 1 10 2.1 Literały napisowe: 'Hello Groovy' '1‘ /I'm slashy string\x/ "I'm Gstring $v" '''Multiline string''' """Multiline GString $x = $y""" Znaki - kodowanie Unicode W Groovy literały są obiektami odpowiednich klas, np. 1 - typ (klasa) Integer 1.1 - typ BigDecimal 'x' - typ String '1' - typ String 'ala ma kota' - typ String "ala ma kota" - typ GString Literały boolowskie - słowa kluczowe: true false Integer - całkowite od do BigDecimal - dowolnie duże liczby z dowolną precyzją 10
11
print - bez przejścia do nowej linii,
Literały - znaki specjalne print '\u03b1\u03b2\u03b3 ' print '\\' print '\'' print " alfa beta gamma '" println '\nalfa\nbeta\ngamma' println "c:\\util\\bak" println /c:\util\bak/ Uwaga na: znaki specjalne, slashy string, różnice w działaniu print - bez przejścia do nowej linii, println - z przejściem αβγ \' alfa beta gamma ' alfa beta gamma c:\util\bak By uzyskać na konsoli Eclipse znaki UTF: "Run Config-Common-Console Encoding" UTF-8 MODTFIKATORY float f = 1f, long l = 1L, double d = 1d, BigDecimal = 1g 11
12
Zmienne i dynamiczne typowanie
W skryptach można nie deklarować zmiennych: x = 10 Deklaracja zmiennej: def lub użycie konkretnego typu. Zmienne nie zadeklarowane lub zadeklarowane z def są dynamicznie typowane: def x = 10 // typ: Integer x = 'Ala' // a teraz zmienił się na String Użycie konkretnego typu w deklaracji zmiennej wymusza zgodność typów (typ zmiennej nie może być zmieniony). Integer v = 1 v = 'Groovy' Zamiast nazwy typu - słowo def (deklaracja zmiennej dowolnego typu): def v = 1 v = 'Groovy' Redeklaracje niedozwolone: def v ... String s Integer s Ok Błędy Błąd 12
13
Zmienne zawierają referencje do obiektów!
W Groovy wszystko jest obiektem . Gdy używamy liczb, napisów, znaków, wartości boolowskich odpowienie obiekty tworzone są automatycznie. W każdym innym przypadku musimy sami tworzyć obiekty za pomocą wyrażenia new, np. d = new Date() scanner = new Scanner(text) file = new File('c:/temp/text.txt') Argumenty wywołania konstruktorów Zmienne zawierają referencje do obiektów! 13
14
Hierarchie typów Typy są wyznaczane przez klasy i przez interfejsy.
Klasy mogą dziedziczyć inne klasy i implementować interfejsy. Object Number extends Object Integer extends Number Literał 1 jest typu Integer i Number i Object AbstractMap extends Object implements Map HashMap extends AbstractMap Obiekt hash-mapa jest typu Object, Map, AbstractMap, HashMap 14
15
Typy proste W Javie oprócz typów obiektowych występują typy proste.
W języku Groovy można używać typów prostych, ale dane tych typów są i tak przekształcane na obiekty odpowiadających im klas. byte b = 1 long l = char c = 'x' int i = 111 [ b, l, c, i ].each { println it.class.name } Wynik: java.lang.Byte java.lang.Long java.lang.Character java.lang.Integer Autoboxing! 15
16
Operatory Operatory arytmetyczne: * mnożenie / dzielenie + dodawanie
- odejmowanie ** potęgowanie (G) % reszta z dzielenia ++ zwiększanie -- zmniejszanie Operatory relacyjne: < mniejsze <= mniejsze lub równe >= większe lub równe > większe == czy równe != czy nie równe Przypisania: = (i pochodne) Operatory logiczne: ! negacja || alternatywa && koniunkcja I wiele innych …. Operator instanceof: stwierdzenie typu: x instanceof A czy x jest typu A lub dowolnego jego podtypu Groovy pozwala na definiowanie operatorów w klasach i w wielu jego standardowych klasach jest to zrobione. 16
17
Operacje na liczbach - cechy szczególne
Przy dzieleniu dwóch liczb całkowitych następuje promocja do BigDecimal i wynik jest zgodny z "arytmetyką". Java: 1/3 == 0 Groovy: 1/3 = Literały rzeczywiste są typu BigDecimal, wobec tego operacje są dokładne. Java: 3 * 0.2 != 0.6 Groovy: 3 * 0.2 = 6 Ciekawe - ULP (Unit of Least Precision, Unit in the Last Place) Potęgowanie: Java: konieczne użycie funkcji z klasy Math Groovy: operator ** 17
18
Złożone operatory przypisania
Złożone operatory przypisania mają postać: op= gdzie op - to jeden z operatorów * / % – << >> >>> & ^ | Złożone operatory przypisania, stosowane w następujący sposób: x op= wyrażenie są wygodną formą skrócenia zapisu: x = x op ( wyrażenie ) gdzie: x - dowolna zmienna wyrażenie - dowolne wyrażenie op - symbol operatora Na przykład, zamiast: numOfChildren = numOfChildren + 2 możemy napisać: numOfChildren += 2 18
19
Zwiększanie i zmniejszanie
Przyrostkowa forma operatorów (znak operatora po argumencie) modyfikuje wartość argumentu po jej wykorzystaniu w wyrażeniu. Przedrostkowa (znak operatora przed argumentem) - przed wykorzystaniem tej wartości. Np. def n, i = 1 n = i // przyrostkowa forma operatora ++ zmienna i zostanie zwiększona o 1, ale zmiennej n zostanie nadana wartość zmiennej i sprzed zwiększenia, czyli po wykonaniu instrukcji: n będzie równe 1 , a i będzie równe 2. def n, i = 1; n = ++i; // przedrostkowa forma operatora ++ zmienna i zostanie zwięksozna o 1 i ta nowa jej wartosć zostanie przypsiana zmiennej n, czyli po wykonaniu instrukcji: n = 2 , i = 2. o jeden wartość argumentu (zmiennej) 19
20
Rodzaje napisów w Groovy
'aa' "bb" 'aaaaa "oo" bb' "bbbbb 'cd' ef" "v = $v" "Today = ${new Date()}" "x[1] = ${x[1]}" '''first line second''' """multi line ev. Gstring""" /In slashy Strings you can use \ without escaping/ Gdy "..." i $ - GString z substytucją zmiennych i wyrażeń Napisy wielowierszowe 'Slashy' Strings
21
Rodzaje napisów w Groovy (2)
Multiline slashy strings: def poem = / to be or not to be / Dollar slashy strings = slashy + GString: „multi-line GString similar to the slashy string, but with slightly different escaping rules. You are no longer required to escape slash (with a preceding backslash) but you can use '$$' to escape a '$' or '$/' to escape a slash if needed”. def town = "Warsaw" def dollarSlashy = $/ In $town, today is ${new Date() } normal $ dollar-sign $$town dollar-sign escaped \ backslash / slash $/$$ slash and dollar /$ println dollarSlashy In Warsaw, today is Tue Mar 13 05:05:05 CET 2012 normal $ dollar-sign $town dollar-sign escaped \ backslash / slash /$ slash and dollar
22
Łączenie napisów Do łączenia napisów służy operator +
txt1 = 'Groovy' txt2 = 'an agile language' res = txt1 + ' is ' + txt2 // Groovy is an agile language Można dołączać inne dane (będą przekształcone na napisy): res = txt1 + ' number ' + 1 // Groovy number 1 now = new Date() res = 'Now is: ' + now // Now is: Sun Aug 09 05:24:07 CEST 2009 Użycie cudzysłowu daje GString (substytucja wyrażeń poprzedzonych $): res = "$txt1 is $txt2" // Groovy is an agile language res = "Now is: ${new Date()}" // Now is: Sun Aug 09 05:24:07 CEST 2009 Uwaga: String na początku! Jeśli wyrażenie nie jest zmienną ujmujemy je w nawiasy klamrowe 22
23
Proste działania na napisach
A. Metody klasy String B. Dodatkowo Groovy: def s = 'abcdefegh' println s.size() println s[0] println s[1] println s[-1] println s[0..2] println s[0..<2] println s.reverse() println s[-1..0] println s.padLeft(15, '+') println s.padRight(15, '+') println s.center(15, '*') println s*2 println s - 'e' println s - 'abc' 9 a b h abc ab hgefedcba ++++++abcdefegh abcdefegh++++++ ***abcdefegh*** abcdefeghabcdefegh abcdfegh defegh Proste działania na napisach A. Metody klasy String B. Dodatkowo Groovy: def s = 'abcdefegh' println s.size() println s[0] println s[1] println s[-1] println s[0..2] println s[0..<2] println s.reverse() println s[-1..0] println s.padLeft(15, '+') println s.padRight(15, '+') println s.center(15, '*') println s*2 println s - 'e' println s - 'abc' 9 a b h abc ab hgefedcba ++++++abcdefegh abcdefegh++++++ ***abcdefegh*** abcdefeghabcdefegh abcdfegh defegh Dostęp do znaków Podłańcuchy Specjalne operatory 23
24
Konwersje napisy - liczby
Pojedyncze znaki mają swoje liczbowe kody i mogą być traktowane jak liczby: char a = 'A' int kod = a println "$a - code: $kod" char c = '1' println "$c - code: " + (int) c kod++ c = (char) kod println "$c - code: $kod" a += 1 println a Po to by z napisu (a nie typu char) uzyskać liczbę, potrzebne są dodatkowe środki: s = '65' int v v = s v = s.toInteger() + 1 // Ok, 66 s.toDouble() s.toBigDecimal() .... inne Błąd wykonania A - code: 65 1 - code: 49 B - code: 66 B Operator rzutowania 24
25
Błędy konwersji Gdy napis nie daje się potraktować jako liczba odpowiedniego typu występuje wyjątek NumberFormatException. Można go oczywiście obsłużyć (jak w Javie), ale w Groovy istnieje możliwość wcześniejszego sprawdzenia czy napis może być traktowany jako liczba odpowiedniego typu. def s1 = '10' def s2 = '1.1' println s1.isInteger() println s2.isDouble() println s2.isBigDecimal() println s1.isDouble() println s1.isBigDecimal() println s2.isInteger() println s1.isNumber() println s2.isNumber() Result: true false Metody sprawdzania typu 25
26
Listy - wprowadzenie Lista - zestaw elementów, które mają określone pozycje w zestawie i mogą się powtarzać. Utworzenie listy w programie: list1 = ['A', 'B', 'C'] list2 = [1, 2, 3, 4, 5] list3 = [1, 'A', 2, 'B', new Date()] elist = [] // pusta lista Dostęp do elementów (indeksowanie od 0): println list1[0] // A list3[1] = 2 // teraz [1,2,2,B ...] Liczba elementów na liście: list1.size() // == 3 Ost. element: list1[-1] // C Odwracanie: list1.reverse() lub list1[-1..0] Sublisty: list[1..2] // [ B, C ] list[-2..-1] // dwa ostatnie znaki Dodawanie elementów do listy: elist << 77 << 81 // teraz [77, 81] list1 += 'A' // teraz [A, B, C, A] Usuwanie elementów z listy: list1 -= 'A' // teraz [B, C] list2.remove(1) // teraz [1,3,4,5] Takie listy są typu: Collection, List i ArrayList. Usuwa dany element Usuwa element o podanym indeksie 26
27
Wieloprzypisania W jednej instrukcji przypisanie na wiele zmiennych
(lista zmiennych) = dowolny obiekt z operatorem indeksowania (a, b) = [1, 2] (a, b) = [b,a] // swap (a, b) = 'ab' 27
28
Rozbiór tekstów def s1 = 'Groovy, Java - ok' Separatory = białe znaki
def list = s1.tokenize() println list list = s1.tokenize(' ,-') Wynik: [Groovy,, Java, -, ok] [Groovy, Java, ok] Separatory = białe znaki ' \t\n\r\f' Separatory = podane 28
29
Łączenie elementów kolekcji w napisy
String join(String separator) Concatenates the toString() representation of each item in this collection, with the given String as a separator between each item. String txt def list = [1,2,3,4] txt = list.join(' - ') println txt txt = ' a b c d' list = txt.tokenize() txt = list.join(' ') Result: a b c d Ten sam efekt: txt = txt.tokenize().join(' ') 29
30
Interakcja z programem
Wprowadzania danych: z konsoli za pomocą skanera (klasa Scanner) input = new Scanner(System.in).next...() z użyciem dialogu wejściowego input = JOptionPane.showInputDialog('Message') (wynikiem jest wprowadzony napis lub null, jeśli anulowano dialog) Pokazywanie wyników w okienku komunikatów JOptionPane.showMessageDialog(null, string) 30
31
Interakcja – przykład 1 import static javax.swing.JOptionPane.*
(kwota, ods) = showInputDialog('Podaj kwote i oprocentowanie').tokenize() println "Kwota: $kwota" println "Oprocentowanie: $ods" kwota = kwota.toBigDecimal() ods = ods.toBigDecimal() println 'Po dodaniu odsetek kwota wynosi ' + (1+ods)*kwota 31
32
Interakcja - przykład 2 import static javax.swing.JOptionPane.*
input = showInputDialog("Enter phrase") data = input.tokenize() println data println "Phrase contains ${data.size()} word(s)" println 'Enter line in console' input = new Scanner(System.in).nextLine() println input input = showInputDialog("Enter 2 integers") scan = new Scanner(input) sum = scan.nextInt() + scan.nextInt() showMessageDialog(null, "Sum: $sum") Rozbicie tekstu na słowa Skaner nałożony na String nextInt pobiera kolejny symbol i przekształca go w liczbę całkowitą [a, b, c] Phrase contains 3 word(s) Enter line in console Groovy lang Console 32
33
Mapy - wprowadzenie Mapa: zestaw par klucz-wartość
Tworzenie w programie: map1 = [:] // pusta mapa map2 = [ Joan: ' ', Steve: ' '] map3 = [:].withDefault { 10 } // z domyślnymi wartościami Dostęp: map2.Joan // map2['Joan'] // map2.Dave // null name = 'Steve' map2[name] // map1['x'] = 7 map1.y = 23 map1.x + map1.y // 30 map3.x = 10 map3.x + map3.y // 30 Takie mapy są typu: Map i LinkedHasMap Zbior kluczy: map.keySet() Zbiór wartości: map.values() Kolekcja wejść: map.entries() 33
34
Interakcja - przykład 3 import static javax.swing.JOptionPane.*
map2 = [ Joan: ' ', Steve: ' '] name = showInputDialog("Enter name:") tel = map2[name] showMessageDialog(null, "$name - tel. $tel") 34
35
Możliwe własne konstrukcje!
Sterowanie if (..) { } if (…) { } else { } while(…) { } do { } while for (init; cond; upd) { } for (typ x : obj) { } for (x in obj) operator in switch(…) … Operator warunkowy Elvis-operator try { } catch { } finally {} throw exc Możliwe własne konstrukcje! 35
36
Warunki W Groovy warunkiem może być wyrażenie dowolnego typu (nie void). W momencie testowania warunku w takich instrukcjach jak if i while wyrażenie jest przekształcane do wartości boolowskiej (true lub false) wg. następującego schematu: Uwaga: w Javie warunkiem może być tylko wyrażenie typu boolean. 36
37
Porównania Operatory służące do porównań:
>, <, >=, <= wołana jest metoda a.compareTo(b) ==, != wołana jest metoda a.equals(b) def txt1 = 'Groovy', txt2 = 'Java' def x = 1, y = 10 def list = ['a', 'b', 'c'] def elist = ['a', 'b', 'c'] max = y if (x > y) max = x println max txt3 = 'G' txt3 += 'roovy' println txt2 > txt1 println txt1 == txt3 println list == elist Wyniki porównań zależą od definicji metod equals i compareTo w klasach obiektów. 10 // bo x.compareTo(y) zwraca false true // bo 'Java'.compareTo('Grovy') zwraca wartość > 0 true // bo zawartość obiektów wskazywanych przez txt1 i txt2 jest taka sama true // bo list i elist ma tę samą zawartość 37
38
Wyrażenia warunkowe Operator warunkowy ?: ma trzy argumenty - wyrażenia i stosowany jest do konstrukcji wyrażenia warunkowego w następujący sposób: e1 ? e2 : e3 // jeśli e1 daje true wynikiem jest e2, inaczej e3 Elvis-operator (skrót dla niektórych sytuacji) e1 ?: e // wynik: jeśli e1 daje true (np. !null) e1, inaczej e2 import static javax.swing.JOptionPane.*; name = showInputDialog('Enter name') userName = name ? name : 'Anonymous' // ternary println "User: $userName" name = showInputDialog('Enter name') ?: 'Anonymous' println "User: $name" 38
39
Zakresy Obiekty typu Range określają zakresy. Wprowadzamy je za pomocą operatorów .. lub ..< Przykłady: // zestaw liczb od 1 do 10 1..<10 // zestaw liczb od 1 do 9 // zakres odwrócony (10, 9, 8, ... 1) 'a'..'c' // litery a, b, c d1 = new Date() d2 = d1 + 7 d1..d2 // daty od dziś do za tydzień
40
Operator in Wyrażenie: e in ob
użyte jako warunek (nie w iteracyjnym for) ma wartość true jeśli w klasie obiektu ob zdefiniowana metoda isCase() zwraca true. def r1 = 1..10 def r2 = 'a'..'c' def d = new Date() def r3 = d..d + 7 def l = [1, 3, 7] def map = [ a: 1, b: 2] def s = 'xaz' println 3 in r1 println 11 in r1 println 'b' in r2 println 'z' in r2 println d + 3 in r3 println d + 10 in r3 println 3 in l println 'b' in map // isCase sprawdza zawartośc keySet println 'xaz' in s // isCase == equals // ale: println 'x' in s true false
41
Instrukcja switch switch(candidate) { case classifier1 : code
[ break ] ... case classifierN : code; [ break] default : code } Przykład: switch(e) { case 1 : println "$e - one"; break case 'Groovy' : println "$e - lang"; break case 'a'..'z' : println "$e - in range"; break case [ 'ala', 'kot'] : println "$e - in list"; break case [ klucz1: 1, klucz2: 2] : println "$e - key in map"; break case BigDecimal : println "$e - BigDecimal"; break default: println "$e - Don't know it" Wynik: if (e== 1) 1 - one if (e == 'Groovy') Groovy - lang if (e == 'x') x - in range if ( e == 2.3) 2.3 – BigDecimal ala - in list klucz1 - key in map Do klasyfikatora której etykiety case pasuje kandydat? Tam przejdzie sterowanie. Jeśli nie ma break wykonywany jest kod następnej etykiety. Jeśli kandydat nigdzie nie pasuje - wykonywany jest kod etykiety default. switch (num) { case : println 'Small' break case : println 'Medium' case : println 'Large' default: println 'Undefined' } Decyduje isCase(candidate) z klasy obiektu case.
42
for (var in iterable) ins for (Typ var : iterable) ins
Instrukcja for-each Gotowe iterable: Kolekcje Mapy Zakresy Napisy Ma postać: for (var in iterable) ins gdzie: var - nazwa zmiennej iterable - obiekt iterowalny (np. zakres, lista, mapa, napis) ins - instrukcja Działanie: w każdym kroku pętli kolejny element obiektu iterowalnego (zestawu) jest podstawiany na zmienną var i wykonywana jest instrukcja ins (w której zazwyczaj sięgamy do zmiennej var) Zgodna z Javą postać tej instrukcji: for (Typ var : iterable) ins ma takie same działanie, ale wymaga podania typu zmiennej
43
For-each przykłady entry
rng = 1..10 sum = 0 for (x in rng) sum += x println sum list = [ 'a', 'b', 'c' ] list1 = [] for (elt in list) list1 << elt + 'X' println list1 for (x in [a:1, b:2, c: 3]) { println x println "$x.key $x.value" } low = 'a' up = 'd' for (c in up..<low) print c napis = 'Warszawa' println() for (c in napis) print "-$c-" entry Z entry można pobrać klucz (.key) i wartość (.value) 55 [aX, bX, cX] a=1 a 1 b=2 b 2 c=3 c 3 dcb -W--a--r--s--z--a--w--a-
Podobne prezentacje
© 2024 SlidePlayer.pl Inc.
All rights reserved.