Атака клонів (2)
Якщо об'єкт R6 містить інший об'єкт R6 в одному або кількох своїх полях, то за замовчуванням clone() копіює такі поля R6 за посиланням. Щоб копіювати ці поля R6 за значенням, метод clone() потрібно викликати з аргументом deep = TRUE.
a_deep_copy <- an_r6_object$clone(deep = TRUE)
Ця вправа є частиною курсу
Об'єктно-орієнтоване програмування з S3 та R6 в R
Інструкції до вправи
Клас R6 PowerPlug, який описує вилку живлення мікрохвильової печі, уже визначено у вашому робочому середовищі. Клас MicrowaveOven оновлено, щоб включати об'єкт PowerPlug.
- Створіть об'єкт
MicrowaveOvenі присвойте його зміннійa_microwave_oven. - Скопіюйте мікрохвильовку у змінну
cloned_microwave_oven, використавши методclone()без аргументів. - Скопіюйте мікрохвильовку у змінну
deep_cloned_microwave_oven, використавши методclone()з аргументомdeep = TRUE. - Змініть поле
typeу поліpower_plugоб'єктаa_microwave_ovenна"British". - Переконайтеся, що поля
power_plug$typeуa_microwave_ovenтаcloned_microwave_ovenідентичні. - Переконайтеся, що поля
power_plug$typeуa_microwave_ovenтаdeep_cloned_microwave_ovenвідрізняються.
Інтерактивна практична вправа
Спробуйте виконати цю вправу, доповнивши цей зразок коду.
# 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(___, ___)