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)