Eletricidade estática
Classes R6 podem usar o comportamento de cópia por referência de ambientes para compartilhar campos entre objetos. Para configurar isso, defina um campo privado chamado shared. Esse campo leva várias linhas para ser definido. Ele deve:
- Criar um novo ambiente.
- Atribuir quaisquer campos compartilhados a esse ambiente.
- Retornar o ambiente.
Os campos compartilhados devem ser acessados por meio de active bindings. Elas funcionam da mesma forma que outras active bindings que você já viu, mas recuperam os campos usando o prefixo private$shared$.
R6Class(
"Thing",
private = list(
shared = {
e <- new.env()
e$a_shared_field <- 123
e
}
),
active = list(
a_shared_field = function(value) {
if(missing(value)) {
private$shared$a_shared_field
} else {
private$shared$a_shared_field <- value
}
}
)
)
Observe que o nome da active binding deve ser o mesmo nome do campo compartilhado que você deseja obter ou definir; ambos são a_shared_field no exemplo acima.
Este exercicio faz parte do curso
Programação Orientada a Objetos com S3 e R6 em R
Instruções do exercicio
Uma classe MicrowaveOven foi parcialmente definida para você.
- No elemento private da classe
MicrowaveOven, atualize o campo chamadoshared.- Esse campo deve conter três linhas de código entre chaves,
{}. - Primeiro, ele deve chamar
new.env()(docs) para criar um novo ambiente chamadoe, depois … - Atribuir uma variável em
echamadasafety_warning, que recebe o valor"Warning. Do not try to cook metal objects.", depois … - Retornar o ambiente.
- Esse campo deve conter três linhas de código entre chaves,
- Adicione uma active binding chamada
safety_warningque obtenha ou defina o campo privado compartilhadosafety_warning.- Defina isso como uma função dentro do elemento
active. - Ela recebe um único argumento chamado
value. - Ela deve obter ou definir
private$shared$safety_warning.
- Defina isso como uma função dentro do elemento
- Crie dois objetos
MicrowaveOven, chamadosa_microwave_oveneanother_microwave_oven, respectivamente. - Altere o campo
safety_warningema_microwave_ovenpara"Warning. If the food is too hot you may scald yourself.". - Olhe o campo
safety_warningemanother_microwave_ovenpara garantir que ele foi alterado.
exercicio interativo prático
Tente este exercicio completando este código de exemplo.
# Complete the class definition
microwave_oven_factory <- R6Class(
"MicrowaveOven",
private = list(
shared = {
# Create a new environment named e
___
# Assign safety_warning into e
___
# Return e
___
}
),
active = list(
# Add the safety_warning binding
safety_warning = ___(___) {
if(___(___)) {
___
} else {
___ <- ___
}
}
)
)
# Create two microwave ovens
a_microwave_oven <- ___
another_microwave_oven <- ___
# Change the safety warning for a_microwave_oven
___ <- "Warning. If the food is too hot you may scald yourself."
# Verify that the warning has change for another_microwave
___