5.2. Wartości, zmienne, metody i typy
W ciele klasy można definiować lub deklarować:
- metody — przy pomocy słowa kluczowego def,
- zmienne — przy pomocy słowa kluczowego var,
- wartości niezmienne — przy pomocy słowa kluczowego val,
- typy — przy pomocy słowa kluczowego type.
W pliku ClassMembers1.scala znajduje się definicja klasy zawierająca wszystkie cztery wymienione elementy.
Plik ClassMembers1.scala: class Hello { type T = String val hello: String = "Hello" var name: T = "John" def greet: String = hello + " " + name }
Instrukcja type definiuje T jako alias typu String. Instrukcja val definiuje wartość niezmienną o nazwie hello i typie String oraz przypisuje jej napis „Hello”. Instrukcja var definiuje zmienną name typu T i przypisuje jej napis „John”. Instrukcja def definiuje metodę o nazwie greet, zwracającą rezultat typu String.
Do składowych instancji klasy odwołujemy się podając po odwołaniu do instancji kropkę i nazwę składowej. Do składowej klasy będącej typem odwołujemy się dodając do nazwy klasy znak # i nazwę typu.
scala> val a = new Hello a: Hello = Hello@6374ef scala> a.hello res0: String = Hello scala> a.name res1: a.T = John scala> a.name = "Peter" a.name: a.T = Peter scala> a.name res2: a.T = Peter scala> a.greet res3: String = Hello Peter scala> val x: a.T = "X" x: a.T = X scala> val y: Hello#T = "Y" y: String = Y
Specyfikacja języka Scala opisuje odwołania do typów będących składowymi w punkcie 3.2.2. |
Definicje wartości i zmiennych mogą zawierać jawne określenie ich typu. Definicje metod mogą zawierać jawne określenie typu rezultatu. W wielu przypadkach jawne deklaracje typu można pominąć i pozwolić kompilatorowi samodzielnie wywnioskować typ. W pliku ClassMembers2.scala znajduje się definicja klasy Hello2, w której — w porównaniu z definicją klasy Hello — usunięte zostały jawne deklaracje typów definiowanej metody, zmiennej i wartości niezmiennej. Mimo to klasa kompiluje się poprawnie.
Plik ClassMembers2.scala: class Hello2 { type T = String val hello = "Hello" var name = "John" def greet = hello + " " + name }
Klasa Hello2 może być używana w sposób podobny do klasy Hello.
scala> val b = new Hello2 b: Hello2 = Hello2@1010bf0 scala> b.hello res4: String = Hello scala> b.name res5: String = John scala> b.name = "Peter" b.name: String = Peter scala> b.name res6: String = Peter scala> b.greet res7: String = Hello Peter scala> val x: b.T = "X" x: b.T = X scala> val y: Hello2#T = "Y" y: String = Y