L'attacco dei cloni (2)
Se un oggetto R6 contiene un altro oggetto R6 in uno o più dei suoi campi, allora per impostazione predefinita clone() copierà i campi R6 per riferimento. Per copiare tali campi R6 per valore, il metodo clone() deve essere chiamato con l'argomento deep = TRUE.
a_deep_copy <- an_r6_object$clone(deep = TRUE)
Questo esercizio fa parte del corso
Programmazione orientata agli oggetti con S3 e R6 in R
Istruzioni dell'esercizio
Nel tuo workspace è stata predefinita una classe R6 PowerPlug per descrivere la spina di alimentazione del microonde. La classe MicrowaveOven è stata aggiornata per includere un oggetto PowerPlug.
- Crea un oggetto
MicrowaveOvene assegnalo aa_microwave_oven. - Copia il microonde in una variabile chiamata
cloned_microwave_ovenusando il metodoclone()senza argomenti. - Copia il microonde in una variabile chiamata
deep_cloned_microwave_ovenusando il metodoclone()passandodeep = TRUE. - Cambia il campo
typedel campopower_plugdia_microwave_ovenin"British". - Verifica che i campi
power_plug$typedia_microwave_ovenecloned_microwave_ovensiano identici. - Verifica che i campi
power_plug$typedia_microwave_ovenedeep_cloned_microwave_ovensiano diversi.
esercizio interattivo pratico
Prova questo esercizio completando questo codice di esempio.
# Create a microwave oven
a_microwave_oven <- microwave_oven_factory$new()
# Look at its power plug
a_microwave_oven$power_plug
# Copy a_microwave_oven using clone(), no args
cloned_microwave_oven <- ___
# Copy a_microwave_oven using clone(), deep = TRUE
deep_cloned_microwave_oven <- ___
# Change a_microwave_oven's power plug type
___$___ <- ___
# Check a_microwave_oven & cloned_microwave_oven same
identical(___, ___)
# Check a_microwave_oven & deep_cloned_microwave_oven different
identical(___, ___)