|
1 | 1 | ---
|
2 | 2 | layout: tour
|
3 |
| -title: Basics |
| 3 | +title: Podstawy |
4 | 4 |
|
5 | 5 | discourse: false
|
6 | 6 |
|
7 | 7 | partof: scala-tour
|
| 8 | + |
| 9 | +num: 2 |
8 | 10 | language: pl
|
| 11 | +next-page: unified-types |
| 12 | +previous-page: tour-of-scala |
9 | 13 | ---
|
| 14 | + |
| 15 | +Na tej stronie omówimy podstawy języka Scala. |
| 16 | + |
| 17 | +## Uruchamianie Scali w przeglądarce |
| 18 | + |
| 19 | +Dzięki ScalaFiddle możesz uruchomić Scalę w swojej przeglądarce. |
| 20 | + |
| 21 | +1. Przejdź do [https://scalafiddle.io](https://scalafiddle.io). |
| 22 | +2. Wklej kod `println("Hello, world!")` w polu po lewej stronie. |
| 23 | +3. Naciśnij przycisk "Run". W panelu po prawej stronie pojawi się wynik działania programu. |
| 24 | + |
| 25 | +Jest to prosta i niewymagająca żadnej instalacji metoda do eksperymentowania z kodem w Scali. |
| 26 | + |
| 27 | +Wiele przykładów kodu w tym przewodniku jest również zintegrowana ze ScalaFiddle, |
| 28 | +dzięki czemu można je wypróbować wciskając po prostu przycisk "Run". |
| 29 | + |
| 30 | +## Wyrażenia |
| 31 | + |
| 32 | +Wyrażenia są rezultatem ewaluacji fragmentów kodu. |
| 33 | + |
| 34 | +``` |
| 35 | +1 + 1 |
| 36 | +``` |
| 37 | + |
| 38 | +Wyniki wyrażeń można wyświetlić za pomocą funkcji `println`. |
| 39 | + |
| 40 | +{% scalafiddle %} |
| 41 | +```tut |
| 42 | +println(1) // 1 |
| 43 | +println(1 + 1) // 2 |
| 44 | +println("Hello!") // Hello! |
| 45 | +println("Hello," + " world!") // Hello, world! |
| 46 | +``` |
| 47 | +{% endscalafiddle %} |
| 48 | + |
| 49 | +### Wartości |
| 50 | + |
| 51 | +Rezultaty wyrażeń mogą zostać nazwane za pomocą słowa kluczowego `val`. |
| 52 | + |
| 53 | +```tut |
| 54 | +val x = 1 + 1 |
| 55 | +println(x) // 2 |
| 56 | +``` |
| 57 | + |
| 58 | +Nazwane wyniki, tak jak `x` w ww. przykładzie, to wartości. |
| 59 | +Odniesienie się do wartości nie powoduje jej ponownego obliczenia. |
| 60 | + |
| 61 | +Wartości nie można przypisać ponownie. |
| 62 | + |
| 63 | +```tut:fail |
| 64 | +x = 3 // Nie kompiluje się. |
| 65 | +``` |
| 66 | + |
| 67 | +Typy wartości mogą być wywnioskowane przez kompilator, ale można również wyraźnie określić type: |
| 68 | + |
| 69 | +```tut |
| 70 | +val x: Int = 1 + 1 |
| 71 | +``` |
| 72 | + |
| 73 | +Zauważ, że deklaracja `Int` pojawia po identyfikatorze `x`, potrzebny jest rówmież dwukropek `:`. |
| 74 | + |
| 75 | +### Zmienne |
| 76 | + |
| 77 | +Zmienne są podobne do wartości, ale z tym wyjątkiem, że można je ponownie przypisywać. |
| 78 | +Zmienną można zdefiniować używając słowa kluczowego `var`. |
| 79 | + |
| 80 | +{% scalafiddle %} |
| 81 | +```tut |
| 82 | +var x = 1 + 1 |
| 83 | +x = 3 // Kompiluje się, ponieważ "x" jest zdefiniowane z użyciem "var". |
| 84 | +println(x * x) // 9 |
| 85 | +``` |
| 86 | +{% endscalafiddle %} |
| 87 | + |
| 88 | +Tak jak przy wartościach, można wyraźnie zdefiniować żądany typ: |
| 89 | + |
| 90 | +```tut |
| 91 | +var x: Int = 1 + 1 |
| 92 | +``` |
| 93 | + |
| 94 | +## Wyrażenia blokowe |
| 95 | + |
| 96 | +Wyrażenia mogą być łączone poprzez zamknięcie ich w nawiasie klamrowym`{}`. |
| 97 | +Taką konstrukcję nazywamy blokiem. |
| 98 | +Wynikiem całego bloku kodu jest wynik ostatniego wyrażenia w tym bloku. |
| 99 | + |
| 100 | +{% scalafiddle %} |
| 101 | +```tut |
| 102 | +println({ |
| 103 | + val x = 1 + 1 |
| 104 | + x + 1 |
| 105 | +}) // 3 |
| 106 | +``` |
| 107 | +{% endscalafiddle %} |
| 108 | + |
| 109 | +## Funkcje |
| 110 | + |
| 111 | +Funkcje to wyrażenia, które przyjmują pewne parametry. |
| 112 | + |
| 113 | +Poniżej zdefiniowana jest funkcja anonimowa (nieposiadająca nazwy), która zwraca liczbę całkowitą przekazaną jako parametr, zwiększoną o 1. |
| 114 | + |
| 115 | +```tut |
| 116 | +(x: Int) => x + 1 |
| 117 | +``` |
| 118 | + |
| 119 | +Po lewej stronie od `=>` znajduje się lista parametrów. |
| 120 | +Po prawej stronie - wyrażenie wykorzystujące te parametry. |
| 121 | + |
| 122 | +Funkcje można również nazywać. |
| 123 | + |
| 124 | +{% scalafiddle %} |
| 125 | +```tut |
| 126 | +val addOne = (x: Int) => x + 1 |
| 127 | +println(addOne(1)) // 2 |
| 128 | +``` |
| 129 | +{% endscalafiddle %} |
| 130 | + |
| 131 | +Funkcje mogą przyjmować wiele parametrów. |
| 132 | + |
| 133 | +{% scalafiddle %} |
| 134 | +```tut |
| 135 | +val add = (x: Int, y: Int) => x + y |
| 136 | +println(add(1, 2)) // 3 |
| 137 | +``` |
| 138 | +{% endscalafiddle %} |
| 139 | + |
| 140 | +Mogą też wcale nie mieć parametrow. |
| 141 | + |
| 142 | +{% scalafiddle %} |
| 143 | +```tut |
| 144 | +val getTheAnswer = () => 42 |
| 145 | +println(getTheAnswer()) // 42 |
| 146 | +``` |
| 147 | +{% endscalafiddle %} |
| 148 | + |
| 149 | +## Metody |
| 150 | + |
| 151 | +Metody wyglądają i zachowują się bardzo podobnie jak funkcje, jednak jest między nimi kilka kluczowych różnic. |
| 152 | + |
| 153 | +Metody są definiowane z użyciem słowa kluczowego `def`. |
| 154 | +Po `def` następuje nazwa metody, lista parametrów, zwracany typ i ciało metody. |
| 155 | + |
| 156 | +{% scalafiddle %} |
| 157 | +```tut |
| 158 | +def add(x: Int, y: Int): Int = x + y |
| 159 | +println(add(1, 2)) // 3 |
| 160 | +``` |
| 161 | +{% endscalafiddle %} |
| 162 | + |
| 163 | +Zauważ, że zwracany typ jest zadeklarowany _po_ liście parametrów i dwukropku `: Int`. |
| 164 | + |
| 165 | +Metody mogą mieć wiele list parametrów. |
| 166 | + |
| 167 | +{% scalafiddle %} |
| 168 | +```tut |
| 169 | +def addThenMultiply(x: Int, y: Int)(multiplier: Int): Int = (x + y) * multiplier |
| 170 | +println(addThenMultiply(1, 2)(3)) // 9 |
| 171 | +``` |
| 172 | +{% endscalafiddle %} |
| 173 | + |
| 174 | +Mogą również wcale ich nie posiadać. |
| 175 | + |
| 176 | +{% scalafiddle %} |
| 177 | +```tut |
| 178 | +def name: String = System.getProperty("user.name") |
| 179 | +println("Hello, " + name + "!") |
| 180 | +``` |
| 181 | +{% endscalafiddle %} |
| 182 | + |
| 183 | +Od funkcji odróżnia je jeszcze kilka innych rzeczy, ale na razie możesz o nich myśleć jak o bardzo podobnych do funkcji. |
| 184 | + |
| 185 | +Metody mogą zawierać również wyrażenia wielowierszowe. |
| 186 | + |
| 187 | +```tut |
| 188 | +def getSquareString(input: Double): String = { |
| 189 | + val square = input * input |
| 190 | + square.toString |
| 191 | +} |
| 192 | +``` |
| 193 | + |
| 194 | +Ostatnie wyrażenie w ciele metody jest wartością, jaką zwraca cała metoda. |
| 195 | +Scala posiada słowo kluczowe `return`, ale jest ono wykorzystywane bardzo rzadko. |
| 196 | + |
| 197 | +## Klasy |
| 198 | + |
| 199 | +Klasy są definiowane za pomocą słowa kluczowego `class`, po którym następuje nazwa klasy i parametry konstruktora. |
| 200 | + |
| 201 | +{% scalafiddle %} |
| 202 | +```tut |
| 203 | +class Greeter(prefix: String, suffix: String) { |
| 204 | + def greet(name: String): Unit = |
| 205 | + println(prefix + name + suffix) |
| 206 | +} |
| 207 | +``` |
| 208 | + |
| 209 | +Metoda `greet` zwraca typ `Unit` - oznacza to, że nie ma nic znaczącego do zwrócenia. |
| 210 | +`Unit` jest używany podobnie jak `void` w językach Java i C. |
| 211 | +Różnica polega na tym, że w Scali każde wyrażenie musi zwracać jakąś wartosć, tak naprawdę istnieje [obiekt singleton](singleton-objects.html) typu `Unit` - nie niesie on ze sobą żadnej znaczącej informacji. |
| 212 | + |
| 213 | +Nowe instancje klasy tworzy się za pomocą słowa kluczowego `new`. |
| 214 | + |
| 215 | +```tut |
| 216 | +val greeter = new Greeter("Hello, ", "!") |
| 217 | +greeter.greet("Scala developer") // Hello, Scala developer! |
| 218 | +``` |
| 219 | +{% endscalafiddle %} |
| 220 | + |
| 221 | +Klasy zostaną szerzej omówione w [dalszej części](classes.html) tego przewodnika. |
| 222 | + |
| 223 | +## Klasy przypadku (case classes) |
| 224 | + |
| 225 | +W Scali istnieje spacjalny typ klasy - klasa "przypadku" (case class). |
| 226 | +Klasy przypadku są domyślnie niezmienne i porównywane przez wartości. |
| 227 | +Klasy te można definiować używająć słów kluczowych `case class`. |
| 228 | + |
| 229 | +{% scalafiddle %} |
| 230 | +```tut |
| 231 | +case class Point(x: Int, y: Int) |
| 232 | +``` |
| 233 | + |
| 234 | +Do utworzenia nowej instacji klasy przypadku nie jest konieczne używanie słowa kluczowego `new`. |
| 235 | + |
| 236 | +```tut |
| 237 | +val point = Point(1, 2) |
| 238 | +val anotherPoint = Point(1, 2) |
| 239 | +val yetAnotherPoint = Point(2, 2) |
| 240 | +``` |
| 241 | + |
| 242 | +Są one porównywane przez wartości - _nie_ przez referencje. |
| 243 | + |
| 244 | +```tut |
| 245 | +if (point == anotherPoint) { |
| 246 | + println(point + " i " + anotherPoint + " są jednakowe.") |
| 247 | +} else { |
| 248 | + println(point + " i " + anotherPoint + " są inne.") |
| 249 | +} // Point(1,2) i Point(1,2) są jednakowe. |
| 250 | +
|
| 251 | +if (point == yetAnotherPoint) { |
| 252 | + println(point + " i " + yetAnotherPoint + " są jednakowe.") |
| 253 | +} else { |
| 254 | + println(point + " i " + yetAnotherPoint + " są inne.") |
| 255 | +} // Point(1,2) i Point(2,2) są inne. |
| 256 | +``` |
| 257 | +{% endscalafiddle %} |
| 258 | + |
| 259 | +Klasy przypadków to dużo szerszy temat, do zapoznania z którym bardzo zachęcamy. Jesteśmy pewni, że Ci się spodoba! |
| 260 | +Jest on dokładnie omówiony w [późniejszym rozdziale](case-classes.html). |
| 261 | + |
| 262 | +## Obiekty |
| 263 | + |
| 264 | +Obiekty to pojedyncze wystąpienia ich definicji. |
| 265 | +Można o nich myśleć jak o instancjach ich własnych klas - singletonach. |
| 266 | + |
| 267 | +Objekty definiuje się z użyciem słowa kluczowego `object`. |
| 268 | + |
| 269 | +{% scalafiddle %} |
| 270 | +```tut |
| 271 | +object IdFactory { |
| 272 | + private var counter = 0 |
| 273 | + def create(): Int = { |
| 274 | + counter += 1 |
| 275 | + counter |
| 276 | + } |
| 277 | +} |
| 278 | +``` |
| 279 | + |
| 280 | +Aby uzyskać dostęp do obiektu używa się jego nazwy. |
| 281 | + |
| 282 | +```tut |
| 283 | +val newId: Int = IdFactory.create() |
| 284 | +println(newId) // 1 |
| 285 | +val newerId: Int = IdFactory.create() |
| 286 | +println(newerId) // 2 |
| 287 | +``` |
| 288 | +{% endscalafiddle %} |
| 289 | + |
| 290 | +Obiekty zostaną szerzej omówione [później](singleton-objects.html). |
| 291 | + |
| 292 | +## Cechy (traits) |
| 293 | + |
| 294 | +Cechy to typy zawierające pewne pola i metody. |
| 295 | +Wiele cech może być łączonych. |
| 296 | + |
| 297 | +Cechę (trait) można zdefiniować używając słowa kluczowego `trait`. |
| 298 | + |
| 299 | +```tut |
| 300 | +trait Greeter { |
| 301 | + def greet(name: String): Unit |
| 302 | +} |
| 303 | +``` |
| 304 | + |
| 305 | +Cechy mogą zawierać domyślną implementację. |
| 306 | + |
| 307 | +{% scalafiddle %} |
| 308 | +```tut |
| 309 | +trait Greeter { |
| 310 | + def greet(name: String): Unit = |
| 311 | + println("Hello, " + name + "!") |
| 312 | +} |
| 313 | +``` |
| 314 | + |
| 315 | +Cechy można rozszerzać używając słowa kluczowego `extends` i nadpisać implementację z użyciem `override`. |
| 316 | + |
| 317 | +```tut |
| 318 | +class DefaultGreeter extends Greeter |
| 319 | +
|
| 320 | +class CustomizableGreeter(prefix: String, postfix: String) extends Greeter { |
| 321 | + override def greet(name: String): Unit = { |
| 322 | + println(prefix + name + postfix) |
| 323 | + } |
| 324 | +} |
| 325 | +
|
| 326 | +val greeter = new DefaultGreeter() |
| 327 | +greeter.greet("Scala developer") // Hello, Scala developer! |
| 328 | +
|
| 329 | +val customGreeter = new CustomizableGreeter("How are you, ", "?") |
| 330 | +customGreeter.greet("Scala developer") // How are you, Scala developer? |
| 331 | +``` |
| 332 | +{% endscalafiddle %} |
| 333 | + |
| 334 | +W tym przykładzie `DefaultGreeter` rozszerza tylko jedną cechę (trait), ale równie dobrze może rozszerzać ich wiele. |
| 335 | + |
| 336 | +Cechy zostały dokładniej opisane w jednym z [kolejnych](traits.html) rozdziałów. |
| 337 | + |
| 338 | +## Metoda Main |
| 339 | + |
| 340 | +Metoda `main` to punkt wejścia do programu. |
| 341 | +Maszyna Wirtalna Javy (Java Virtual Machine / JVM) wymaga, aby metoda ta nazywała się "main" i posiadała jeden arguemnt - tablicę ciągów znaków. |
| 342 | + |
| 343 | +Z użyciem obiektu można zdefiniować metodę `main` w następujący sposób: |
| 344 | + |
| 345 | +```tut |
| 346 | +object Main { |
| 347 | + def main(args: Array[String]): Unit = |
| 348 | + println("Hello, Scala developer!") |
| 349 | +} |
| 350 | +``` |
0 commit comments