Kom igångKom igång gratis

Statisk elektricitet

R6-klasser kan utnyttja miljöers kopiera-via-referens-beteende för att dela fält mellan objekt. För att sätta upp detta definierar du ett privat fält med namnet shared. Det här fältet tar flera rader att definiera och ska:

  • Skapa en ny miljö.
  • Tilldela delade fält till den miljön.
  • Returnera miljön.

De delade fälten ska nås via aktiva bindningar. Dessa fungerar på samma sätt som andra aktiva bindningar du har sett, men hämtar fälten med prefixet 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
      }
    }
  )
)

Observera att namnet på den aktiva bindningen måste vara detsamma som namnet på det delade fält du vill hämta eller sätta – i exemplet ovan är båda a_shared_field.

Den här övningen är en del av kursen

Objektorienterad programmering med S3 och R6 i R

Visa kurs

Övningsinstruktioner

En MicrowaveOven-klass har delvis definierats åt dig.

  • I det privata elementet i klassen MicrowaveOven, uppdatera fältet med namnet shared.
    • Det här fältet ska innehålla tre rader kod omslutna av klammerparenteser, {}.
    • Börja med att anropa new.env() (docs) för att skapa en ny miljö med namnet e, sedan …
    • Tilldela en variabel i e med namnet safety_warning och värdet "Warning. Do not try to cook metal objects.", sedan …
    • Returnera miljön.
  • Lägg till en aktiv bindning med namnet safety_warning som hämtar eller sätter det privata delade fältet safety_warning.
    • Definiera den som en funktion inuti elementet active.
    • Den tar ett enda argument med namnet value.
    • Den ska hämta eller sätta private$shared$safety_warning.
  • Skapa två MicrowaveOven-objekt med namnen a_microwave_oven respektive another_microwave_oven.
  • Ändra fältet safety_warninga_microwave_oven till "Warning. If the food is too hot you may scald yourself.".
  • Kontrollera fältet safety_warninganother_microwave_oven för att bekräfta att det har ändrats.

Interaktiv övning med praktiskt arbete

Testa den här övningen genom att slutföra den här exempelkoden.

# 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
___ 
Redigera och kör kod