MI-PSL-3 Flashcards
- Write the equivalent constructs if the primary constructor’s formal parameter is preceded by the keyword var.
class X(var x: Int) is equivalent to:
class X($x: Int) { var x = $x }
is equivalent to:
class X($x: Int) { private var \$\$x = $x def x = \$\$x def x_=(x: Int) { \$\$x = x } }
- Write an example of the class with an auxiliary constructor.
jde o pomocne konstruktory class Rectangle(val width : Double, val height : Double) { def this(side : Double) { this(side, side) } }
- How traits differ (what lacks) from non-trait classes?
trait nemůže mít konstruktor s parametry a nevolá se konstruktor nadtřídy, protože trait se inicializuje až poté, co byla nadtřída inicializována.
- What object definitions lack unlike class definitions?
type parameters, constructor parameters (it is forbidden to create objects by the new operator).
- When is an object created?
Objekt se vytvoří, až když někdo poprvé přistoupí k jeho členské metodě, hodnotě nebo proměnné. Tedy nemusí se po dobu běhu programu vytvořit vůbec.
- What is companion object?
Jedná se o objekt nesoucí stejné jméno jako jeho třída, pokud je definovaný ve stejném kontextu.
- How can be in Scala substitute Java’s static members?
Stejný efekt jako static v Javě se dá docílit vytvořením companion objektu (viz otázka výše), jeho členské metody, hodnoty a proměnné se chovají jako statické.
- How is defined operator == in class Any?
Porovnání se deleguje na abstraktní metodu equals, kterou podtřídy (AnyRef a AnyVal) implementují podle potřebné sémantiky:
abstract class Any { def equals(that: Any): Boolean // abstraktní metoda final def == (that: Any): Boolean = this equals that // ... }
- Where is defined method eq and what is its semantic?
Metoda eq je definována ve třídě AnyRef (nadtřída všech referenčních typů, zhruba ekvivalent k javovskému Object) a porovnává reference, tedy jako == v Javě.
- How is defined value null?
null je jediná hodnota třídy scala.Null. Třída Null je podtřídou všech referenčních typů.
Základní vlastnosti:
null se rovná pouze sobě (platí null == null),
isInstanceOf vrací vždy false.
- What is it Nothing?
Nothing je abstraktní třída, která je podtřídou všech ostatních tříd (včetně Null). Používá se např. jako návratová hodnota výrazu throw.
- How is defined Some?
Jedná se o case podtřídu třídy Option, která vyjadřuje, že prvek existuje. Abstraktní metodu isEmpty ze třídy Option definuje jako false a abstraktní metodu get definuje jako vrácení prvku.
- How is defined None?
Jedná se o case objekt třídy Option, která vyjadřuje, že prvek neexistuje (jeho typ je tedy Option[Nothing]). Abstraktní metodu isEmpty ze třídy Option definuje jako true a abstraktní metoda get vyhodí výjimku, že prvek neexistuje.
- What are case class features?
K parametrům primárního konstruktoru (pouze v prvním seznamu parametrů, pokud jich má více) se automaticky doplní val, pokud už není var. Tedy case class Rect(width : Int, height : Int) je ekvivalentní
case class Rect(val width : Int, val height : Int)
Při porovnávání dvou case tříd se očekává, že hodnota závisí pouze na členských hodnotách (nikoliv proměnných), proto se používají k vyjádření neměnných (immutable) struktur, jako seznamy, stromy apod.
Dají se implicitně použít v pattern matchingu.
Automaticky se jim vytvoří metoda copy (viz otázka níže).
Při definici case třídy se automaticky vytvoří companion objekt typu extractor (obsahuje metodu unapply, obvykle má i apply jako simulaci konstruktoru).
- What is it the extractor object?
Jedná se o objekt, který má definovanou metodu unapply s jedním parametrem. Ta se zavolá v případě použití objektu v pattern matchingu. Pattern vyhoví, pokud unapply má navratový typ Boolean a vrátí true, nebo pokud má návratový typ Option a vrátí Some.
Obvykle má také definovanou metodu apply, která nahrazuje konstruktor, např. zápis
MyObject(1, 2)
se přeloží jako volání metody apply:
MyObject.apply(1, 2)
- How is defined the method copy of case class?
Metoda copy je automaticky vložena do každé case třídy, její parametry odpovídají všem hodnotám (val) třídy, zároveň mají definované implicitní hodnoty, tedy volání myObject.copy vytvoří identickou kopii myObject (což není moc smysluplné), myObject.copy(width = 2) vytvoří kopii, kde pouze změní hodnotu width a ostatní zůstanou stejné. Definice vypadá takto:
def copy[ TypePars ](x1 : T1 = this.x1, x2 : T2 = this.x2, ...) = new C[ TypeArgs ](x1, x2, ...)
- How is defined method equals of case class?
Vrátí true, pokud obě instance jsou stejné třídy a pokud se rovnají hodnoty argumentů jejich konstruktorů (tedy platí Rect(1,1) == Rect(1,1), ale Rect(1,2) != Rect(1,1)).