Inizia subitoInizia gratis

Prima di tutto

Esiste un metodo pubblico speciale chiamato initialize() (nota l’ortografia in inglese americano). Questo non viene chiamato direttamente dall’utente. Viene invece richiamato automaticamente quando si crea un oggetto; cioè quando l’utente chiama new().

initialize() ti permette di impostare i valori dei campi privati quando crei un oggetto R6. Lo schema per una funzione initialize() è il seguente:

thing_factory <- R6Class(
  "Thing",
  private = list(
    a_field = "a value",
    another_field = 123
  ),
  public = list(
    initialize = function(a_field, another_field) {
      if(!missing(a_field)) {
        private$a_field <- a_field
      }
      if(!missing(another_field)) {
        private$another_field <- another_field
      }
    }
  )
)

Nota l’uso di missing() (docs). Questa funzione restituisce TRUE se un argomento non è stato passato nella chiamata alla funzione.

Gli argomenti del metodo new() della factory vengono passati a initialize().

a_thing <- thing_factory$new(
  a_field = "a different value", 
  another_field = 456
)

Questo esercizio fa parte del corso

Programmazione orientata agli oggetti con S3 e R6 in R

Visualizza corso

Istruzioni dell'esercizio

Una factory di forni a microonde è stata parzialmente definita per te.

  • Aggiungi un metodo pubblico chiamato initialize(). Questo deve permettere all’utente di impostare i campi power_rating_watts e door_is_open quando l’oggetto viene creato.
    • Gli argomenti devono essere power_rating_watts e door_is_open.
    • Nel corpo del metodo initialize(), per ciascun argomento, se non è missing() (docs), allora imposta il corrispondente campo privato.
  • Crea un oggetto microonde con una potenza nominale di 650 watt e con la porta aperta.
    • Chiama il metodo new() di microwave_oven_factory.
    • Passa gli argomenti power_rating_watts = 650 e door_is_open = TRUE a new().
    • Assegna il risultato a a_microwave_oven.

esercizio interattivo pratico

Prova questo esercizio completando questo codice di esempio.

# Add an initialize method
microwave_oven_factory <- R6Class(
  "MicrowaveOven",
  private = list(
    power_rating_watts = 800,
    door_is_open = FALSE
  ),
  public = list(
    cook = function(time_seconds) {
      Sys.sleep(time_seconds)
      print("Your food is cooked!")
    },
    open_door = function() {
      private$door_is_open <- TRUE
    },
    close_door = function() {
      private$door_is_open <- FALSE
    },
    # Add initialize() method here
    ___ = ___(___, ___) {
      if(!missing(power_rating_watts)) {
        private$power_rating_watts <- power_rating_watts
      }
      ___
      
      
    }
  )
)

# Make a microwave
a_microwave_oven <- ___
Modifica ed esegui il codice