LoslegenKostenlos loslegen

Statische Elektrizität

R6-Klassen können das Copy-by-Reference-Verhalten von Environments nutzen, um Felder zwischen Objekten zu teilen. Richte das ein, indem du ein privates Feld namens shared definierst. Dieses Feld umfasst mehrere Zeilen und sollte:

  • Ein neues Environment erstellen.
  • Alle geteilten Felder diesem Environment zuweisen.
  • Das Environment zurückgeben.

Auf die geteilten Felder wird über aktive Bindungen zugegriffen. Diese funktionieren genauso wie andere aktive Bindungen, die du bereits gesehen hast, holen die Felder aber mit dem Präfix 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
      }
    }
  )
)

Beachte, dass der Name der aktiven Bindung derselbe sein muss wie der Name des geteilten Feldes, das du lesen oder setzen willst; im obigen Beispiel heißen beide a_shared_field.

Diese Übung ist Teil des Kurses

Objektorientierte Programmierung mit S3 und R6 in R

Kurs anzeigen

Anleitung zur Übung

Eine MicrowaveOven-Klasse wurde bereits teilweise für dich definiert.

  • Aktualisiere im privaten Element der Klasse MicrowaveOven das Feld shared.
    • Dieses Feld soll drei Codezeilen in geschweiften Klammern {} enthalten.
    • Zuerst soll es new.env() (Docs) aufrufen, um ein neues Environment namens e zu erstellen, dann …
    • Weise in e eine Variable namens safety_warning zu, mit dem Wert "Warning. Do not try to cook metal objects.", dann …
    • Gib das Environment zurück.
  • Füge eine aktive Bindung namens safety_warning hinzu, die das private geteilte Feld safety_warning liest oder setzt.
    • Definiere diese als Funktion innerhalb des Elements active.
    • Sie nimmt ein einzelnes Argument namens value.
    • Sie soll private$shared$safety_warning lesen oder setzen.
  • Erzeuge zwei Objekte der Klasse MicrowaveOven mit den Namen a_microwave_oven und another_microwave_oven.
  • Ändere das Feld safety_warning von a_microwave_oven zu "Warning. If the food is too hot you may scald yourself.".
  • Sieh dir das Feld safety_warning von another_microwave_oven an, um sicherzugehen, dass es geändert wurde.

Interaktive Übung

Vervollständige den Beispielcode, um diese Übung erfolgreich abzuschließen.

# 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
___ 
Code bearbeiten und ausführen