ÎncepețiÎncepe gratuit

Electricitate statică

Clasele R6 pot folosi comportamentul de copiere prin referință al mediilor pentru a partaja câmpuri între obiecte. Pentru a configura acest lucru, definește un câmp privat numit shared. Acest câmp necesită mai multe linii de cod și ar trebui să:

  • Creeze un mediu nou.
  • Atribuie câmpurile partajate acelui mediu.
  • Returneze mediul.

Câmpurile partajate ar trebui accesate prin intermediul legărilor active. Acestea funcționează la fel ca celelalte legări active pe care le-ai văzut, dar preiau câmpurile folosind prefixul 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
      }
    }
  )
)

Reține că numele legării active trebuie să fie același cu numele câmpului partajat pe care vrei să îl obții sau să îl setezi; în exemplul de mai sus, ambele sunt a_shared_field.

Acest exercițiu face parte din cursul

Programare orientată pe obiecte cu S3 și R6 în R

Vezi cursul

Instrucțiuni pentru exercițiu

O clasă MicrowaveOven a fost parțial definită pentru tine.

  • În elementul privat al clasei MicrowaveOven, actualizează câmpul numit shared.
    • Acest câmp ar trebui să conțină trei linii de cod cuprinse între acolade, {}.
    • Mai întâi, apelează new.env() (docs) pentru a crea un mediu nou numit e, apoi …
    • Atribuie în e o variabilă numită safety_warning, cu valoarea "Warning. Do not try to cook metal objects.", apoi …
    • Returnează mediul.
  • Adaugă o legare activă numită safety_warning care obține sau setează câmpul privat partajat safety_warning.
    • Definește-o ca funcție în interiorul elementului active.
    • Primește un singur argument numit value.
    • Ar trebui să obțină sau să seteze private$shared$safety_warning.
  • Creează două obiecte MicrowaveOven, numite a_microwave_oven și respectiv another_microwave_oven.
  • Modifică câmpul safety_warning al obiectului a_microwave_oven la "Warning. If the food is too hot you may scald yourself.".
  • Verifică câmpul safety_warning al obiectului another_microwave_oven pentru a te asigura că a fost modificat.

Exercițiu interactiv practic

Încearcă acest exercițiu completând acest cod de exemplu.

# Complete the class definition
microwave_oven_factory <- R6Class(
  "MicrowaveOven",
  private = list(
    shared = {
      # Create a new environment named e
      ___
      # Assign safety_warning into e
      ___
      # Return e
      ___
    }
  ),
  active = list(
    # Add the safety_warning binding
    safety_warning = ___(___) {
      if(___(___)) {
        ___
      } else {
        ___ <- ___
      }
    }
  )
)

# Create two microwave ovens
a_microwave_oven <- ___
another_microwave_oven <- ___
  
# Change the safety warning for a_microwave_oven
___ <- "Warning. If the food is too hot you may scald yourself."
  
# Verify that the warning has change for another_microwave
___ 
Editează și rulează codul