Ataque dos Clones (2)
Se um objeto R6 contiver outro objeto R6 em um ou mais de seus campos, então, por padrão, clone() copiará os campos R6 por referência. Para copiar esses campos R6 por valor, o método clone() deve ser chamado com o argumento deep = TRUE.
a_deep_copy <- an_r6_object$clone(deep = TRUE)
Este exercicio faz parte do curso
Programação Orientada a Objetos com S3 e R6 em R
Instruções do exercicio
Uma classe R6 PowerPlug, que descreve o plugue de energia do micro-ondas, já foi pré-definida no seu workspace. A classe MicrowaveOven foi atualizada para incluir um objeto PowerPlug.
- Crie um objeto
MicrowaveOvene atribua-o aa_microwave_oven. - Copie o micro-ondas para uma variável chamada
cloned_microwave_ovenusando o métodoclone()sem argumentos. - Copie o micro-ondas para uma variável chamada
deep_cloned_microwave_ovenusando o métodoclone()comdeep = TRUE. - Altere o campo
typedo campopower_plugdea_microwave_ovenpara"British". - Verifique se os campos
power_plug$typedea_microwave_ovenecloned_microwave_ovensão idênticos. - Verifique se os campos
power_plug$typedea_microwave_ovenedeep_cloned_microwave_ovensão diferentes.
exercicio interativo prático
Tente este exercicio completando este código de exemplo.
# 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(___, ___)