1. Učit se
  2. /
  3. Kurzy
  4. /
  5. Objektově orientované programování s S3 a R6 v R

Connected

Cvičení

Statická elektřina

Třídy R6 mohou využívat chování prostředí při kopírování odkazem ke sdílení polí mezi objekty. Aby to fungovalo, definuj privátní pole s názvem shared. Toto pole vyžaduje několik řádků kódu. Mělo by:

  • Vytvořit nové prostředí.
  • Přiřadit do něj sdílená pole.
  • Vrátit toto prostředí.

Přístup ke sdíleným polím zajistíš pomocí aktivních vazeb. Fungují stejně jako ostatní aktivní vazby, které už znáš, ale pro přístup k polím používají prefix private$shared$.

R6Class(
  "Thing",
  private = list(
    shared = {
      e <- new.env()
      e$a_shared_field <- 123
      e
    }
  ),
  active = list(
    a_shared_field = function(value) {
      if(missing(value)) {
        private$shared$a_shared_field
      } else {
        private$shared$a_shared_field <- value
      }
    }
  )
)

Název aktivní vazby musí být stejný jako název sdíleného pole, které chceš číst nebo nastavovat – v příkladu výše jsou oba a_shared_field.

Pokyny

100 XP

Třída MicrowaveOven je pro tebe částečně předpřipravená.

  • V privátním elementu třídy MicrowaveOven aktualizuj pole shared.
    • Toto pole by mělo obsahovat tři řádky kódu uzavřené ve složených závorkách {}.
    • Nejprve zavolej new.env() (dokumentace) pro vytvoření nového prostředí s názvem e, poté …
    • Přiřaď do e proměnnou safety_warning s hodnotou "Warning. Do not try to cook metal objects.", a nakonec …
    • Vrať toto prostředí.
  • Přidej aktivní vazbu s názvem safety_warning, která čte nebo nastavuje privátní sdílené pole safety_warning.
    • Definuj ji jako funkci uvnitř elementu active.
    • Přijímá jediný argument s názvem value.
    • Měla by číst nebo nastavovat private$shared$safety_warning.
  • Vytvoř dva objekty MicrowaveOven s názvy a_microwave_oven a another_microwave_oven.
  • Změň pole safety_warning na objektu a_microwave_oven na hodnotu "Warning. If the food is too hot you may scald yourself.".
  • Podívej se na pole safety_warning objektu another_microwave_oven a ověř, že se hodnota také změnila.