Útok klonů (2)
Pokud R6 objekt obsahuje v jednom nebo více polích jiný R6 objekt, metoda clone() ve výchozím nastavení zkopíruje tato R6 pole odkazem. Aby došlo ke kopírování hodnotou, je nutné zavolat metodu clone() s argumentem deep = TRUE.
a_deep_copy <- an_r6_object$clone(deep = TRUE)
Toto cvičení je součástí kurzu
Objektově orientované programování s S3 a R6 v R
Pokyny k cvičení
V tvém pracovním prostoru je předem definovaná R6 třída PowerPlug popisující zástrčku mikrovlnné trouby. Třída MicrowaveOven byla aktualizována tak, aby obsahovala objekt PowerPlug.
- Vytvoř objekt třídy
MicrowaveOvena přiřaď ho do proměnnéa_microwave_oven. - Zkopíruj mikrovlnnou troubu do proměnné
cloned_microwave_ovenpomocí metodyclone()bez argumentů. - Zkopíruj mikrovlnnou troubu do proměnné
deep_cloned_microwave_ovenpomocí metodyclone()s argumentemdeep = TRUE. - Změň pole
typev polipower_plugobjektua_microwave_ovenna hodnotu"British". - Ověř, že pole
power_plug$typeobjektůa_microwave_ovenacloned_microwave_ovenjsou shodná. - Ověř, že pole
power_plug$typeobjektůa_microwave_ovenadeep_cloned_microwave_ovense liší.
Interaktivní cvičení na vyzkoušení si v praxi
Vyzkoušejte si toto cvičení dokončením tohoto ukázkového kódu.
# 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(___, ___)