Statická elektřina
Třídy R6 mohou využívat chování prostředí při kopírování odkazem ke sdílení polí mezi objekty. Aby to fungovalo, definuj privátní pole s názvem shared. Toto pole vyžaduje několik řádků kódu. Mělo by:
- Vytvořit nové prostředí.
- Přiřadit do něj sdílená pole.
- Vrátit toto prostředí.
Přístup ke sdíleným polím zajistíš pomocí aktivních vazeb. Fungují stejně jako ostatní aktivní vazby, které už znáš, ale pro přístup k polím používají prefix 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
}
}
)
)
Název aktivní vazby musí být stejný jako název sdíleného pole, které chceš číst nebo nastavovat – v příkladu výše jsou oba a_shared_field.
Toto cvičení je součástí kurzu
Objektově orientované programování s S3 a R6 v R
Pokyny k cvičení
Třída MicrowaveOven je pro tebe částečně předpřipravená.
- V privátním elementu třídy
MicrowaveOvenaktualizuj poleshared.- Toto pole by mělo obsahovat tři řádky kódu uzavřené ve složených závorkách
{}. - Nejprve zavolej
new.env()(dokumentace) pro vytvoření nového prostředí s názveme, poté … - Přiřaď do
eproměnnousafety_warnings hodnotou"Warning. Do not try to cook metal objects.", a nakonec … - Vrať toto prostředí.
- Toto pole by mělo obsahovat tři řádky kódu uzavřené ve složených závorkách
- Přidej aktivní vazbu s názvem
safety_warning, která čte nebo nastavuje privátní sdílené polesafety_warning.- Definuj ji jako funkci uvnitř elementu
active. - Přijímá jediný argument s názvem
value. - Měla by číst nebo nastavovat
private$shared$safety_warning.
- Definuj ji jako funkci uvnitř elementu
- Vytvoř dva objekty
MicrowaveOvens názvya_microwave_ovenaanother_microwave_oven. - Změň pole
safety_warningna objektua_microwave_ovenna hodnotu"Warning. If the food is too hot you may scald yourself.". - Podívej se na pole
safety_warningobjektuanother_microwave_ovena ověř, že se hodnota také změnila.
Interaktivní cvičení na vyzkoušení si v praxi
Vyzkoušejte si toto cvičení dokončením tohoto ukázkového kódu.
# 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
___