19.1. Pętla for
W języku Scala istnieje pętla for, która ma postać:
- for (wyrażenia) wyrażenie
lub
- for {wyrażenia} wyrażenie
Działanie pętli for poznamy stopniowo za pomocą kolejnych przykładów. Zadaniem pętli z pierwszego przykładu jest wyświetlenie kolejnych elementów ciągu liczbowego.
scala> for (x <- Seq(1,2,3)) println(x) 1 2 3
Wyrażenie x <- Seq(1,2,3) jest tak zwanym generatorem. Generator składa się ze strzałki skierowanej w lewo (znaki <- lub znak ←), po których lewej stronie występuje wzorzec, a po prawej wyrażenie. W opisywanym przypadku wzorzec jest zwykłą zmienną, a wyrażenie sekwencją trzech liczb. Zmienne występujące we wzorcu są wiązane kolejno z elementami sekwencji i dla każdego pasującego wiązania jest wykonywana instrukcja println. Jeśli któregoś w wyrażeń nie uda się dopasować do wzorca występującego po lewej stronie strzałki, nie zostanie ono przetworzone w pętli. Pokazuje to kolejny przykład, w którym wzorzec dopasowuje tylko krotki dwuelementowe.
scala> for ((x,_) <- List((1,2), (4,5,6), (7,8))) println(x) 1 7
Generator nie jest jedynym rodzajem wyrażenia, które może pojawić się w nawiasach w pętli for, choć zawsze musi istnieć przynajmniej jeden generator i to na pierwszej pozycji. Innym rodzajem wyrażenia jest dozór, czyli wyrażenie warunkowe, które pozwala ograniczyć wykonanie pętli do niektórych wartości. Dozór składa się ze słowa kluczowego if, po którym występuje warunek logiczny. Poniższy przykład wyświetla liczby parzyste z przedziału od 1 do 10. Generator produkuje sekwencję liczb od 1 do 10, a wyrażenie warunkowe „przepuszcza” tylko liczby podzielne przez 2, a więc tylko liczby parzyste.
scala> for (x <- Seq(1,2,3,4,5,6,7,8,9,10) if x % 2 == 0) println(x) 2 4 6 8 10
Pętla for może zawierać wiele generatorów oddzielonych średnikiem. W poniższym przykładzie użyte są dwa generatory. Przykład wypisuje na ekranie krótką tabliczkę mnożenia.
scala> for (x <- Seq(1,2); y <- Seq(1,2)) println(x + " * "+ y + " = " + (x*y)) 1 * 1 = 1 1 * 2 = 2 2 * 1 = 2 2 * 2 = 4
Ostatnie wyrażenie można zapisać inaczej, dodając do listy wyrażeń w nawiasach ostatni, trzeci — obok generatorów i dozorów — rodzaj wyrażenia, który może się tam znajdować — definicję wartości. Definicja wartości jest wyrażeniem mającym postać wzorca, po którym następuje znak równości i wyrażenie. Poprzedni przykład można inaczej zapisać w sposób następujący.
scala> for (x <- Seq(1,2);
| y <- Seq(1,2);
| r = x*y) println(x+" * "+y+" = "+r)
1 * 1 = 1
1 * 2 = 2
2 * 1 = 2
2 * 2 = 4
Kolejny przykład wykorzystuje wzorzec inny niż zwykła zmienna.
scala> for (y <- List((1,2), (7,8)); (x,_) = y) println(x) 1 7
Poniżej przedstawiony jest jeszcze inny sposób zapisu przykładu z tabliczką mnożenia. Tym razem wyrażenia pętli for zostały umieszczone w nawiasach klamrowych, a nie okrągłych. W tym przykładzie nie są wymagane średniki oddzielające poszczególne wyrażenia pętli, gdyż wyrażenia te znajdują się właśnie w nawiasach klamrowych, co pozwala zadziałać mechanizmowi uzupełniania średników w miejscu występowania znaku przejścia do nowego wiersza.
scala> for {
| x <- Seq(1,2)
| y <- Seq(1,2)
| r = x*y
| } println(x+" * "+y+" = "+r)
1 * 1 = 1
1 * 2 = 2
2 * 1 = 2
2 * 2 = 4
