MI-PSL-3 Flashcards

1
Q
  1. Write the equivalent constructs if the primary constructor’s formal parameter is preceded by the keyword var.
A
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 }
}
How well did you know this?
1
Not at all
2
3
4
5
Perfectly
2
Q
  1. Write an example of the class with an auxiliary constructor.
A
jde o pomocne konstruktory
class Rectangle(val width : Double, val height : Double) {
    def this(side : Double) {
        this(side, side)
    }
}
How well did you know this?
1
Not at all
2
3
4
5
Perfectly
3
Q
  1. How traits differ (what lacks) from non-trait classes?
A

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.

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
4
Q
  1. What object definitions lack unlike class definitions?
A
type parameters,
constructor parameters (it is forbidden to create objects by the new operator).
How well did you know this?
1
Not at all
2
3
4
5
Perfectly
5
Q
  1. When is an object created?
A

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.

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
6
Q
  1. What is companion object?
A

Jedná se o objekt nesoucí stejné jméno jako jeho třída, pokud je definovaný ve stejném kontextu.

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
7
Q
  1. How can be in Scala substitute Java’s static members?
A

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 well did you know this?
1
Not at all
2
3
4
5
Perfectly
8
Q
  1. How is defined operator == in class Any?
A

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
    // ...
}
How well did you know this?
1
Not at all
2
3
4
5
Perfectly
9
Q
  1. Where is defined method eq and what is its semantic?
A

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 well did you know this?
1
Not at all
2
3
4
5
Perfectly
10
Q
  1. How is defined value null?
A

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.

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
11
Q
  1. What is it Nothing?
A

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 well did you know this?
1
Not at all
2
3
4
5
Perfectly
12
Q
  1. How is defined Some?
A

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 well did you know this?
1
Not at all
2
3
4
5
Perfectly
13
Q
  1. How is defined None?
A

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.

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
14
Q
  1. What are case class features?
A
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).

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
15
Q
  1. What is it the extractor object?
A

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 well did you know this?
1
Not at all
2
3
4
5
Perfectly
16
Q
  1. How is defined the method copy of case class?
A

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, ...)
17
Q
  1. How is defined method equals of case class?
A

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)).