LoslegenKostenlos loslegen

Leistung steuern

Active Bindings können auch verwendet werden, um private Felder zu setzen. In diesem Fall sollte die Binding-Funktion ein einzelnes Argument namens "value" akzeptieren.

Das Muster zum Erstellen eines lese-/schreibfähigen Active Bindings sieht so aus.

thing_factory <- R6Class(
  "Thing",
  private = list(
    ..a_field = "a value"
  ),
  active = list(
    a_field = function(value) {
      if(missing(value)) {
        private$..a_field
      } else {
        assert_is_a_string(value) # oder eine andere Assertion
        private$..a_field <- value
      }
    }
  )
)

Werte werden zugewiesen, als wäre das Binding eine Datenvariable, nicht eine Funktion.

a_thing <- thing_factory$new()
a_thing$a_field <- "a new value" # nicht a_thing$a_field("a new value")

Diese Übung ist Teil des Kurses

Objektorientierte Programmierung mit S3 und R6 in R

Kurs anzeigen

Anleitung zur Übung

Eine Mikrowellenofen-Klasse ist teilweise für dich definiert.

  • Erweitere die Definition der Mikrowellenofen-Klasse um ein active-Listenelement.
  • Füge dem active-Element ein Active Binding hinzu, um die Leistung zu steuern.
    • Die Funktion soll power_level_watts heißen.
    • Sie soll ein einzelnes Argument namens value akzeptieren.
    • Die private Variable zum Lesen/Schreiben heißt ..power_level_watts.
    • Verwende assert_is_a_number() (Docs), um zu prüfen, dass value eine einzelne Zahl ist.
    • Verwende assert_all_are_in_closed_range() (Docs), um zu prüfen, dass value zwischen 0 und ..power_rating_watts liegt.
  • Erstelle ein Mikrowellenofen-Objekt und weise es a_microwave_oven zu.
  • Lies den Leistungswert aus.
  • Versuche, den Leistungswert auf den String "400" zu setzen.
  • Versuche, den Leistungswert auf 1600 zu setzen.
  • Setze den Leistungswert auf 400.

Interaktive Übung

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

# Add a binding for power rating
microwave_oven_factory <- R6Class(
  "MicrowaveOven",
  private = list(
    ..power_rating_watts = 800,
    ..power_level_watts = 800
  ),
  # Add active list containing an active binding
  ___ = ___(
    ___ = ___(___) {
      if(missing(___)) {
        # Return the private value
        ___
      } else {
        # Assert that value is a number
        ___
        # Assert that value is in a closed range from 0 to power rating
        ___
        # Set the private power level to value
        ___ <- ___
      }
    }
  )
)

# Make a microwave 
a_microwave_oven <- ___

# Get the power level
___

# Try to set the power level to "400"
___ <- ___

# Try to set the power level to 1600 watts
___ <- ___

# Set the power level to 400 watts
___ <- ___
Code bearbeiten und ausführen