Statik Elektrik
R6 sınıfları, nesneler arasında alanları paylaşmak için ortamların başvuru ile kopyalama (copy by reference) davranışını kullanabilir. Bunu ayarlamak için shared adlı özel (private) bir alan tanımla. Bu alan birkaç satırda tanımlanır. Şunları yapmalı:
- Yeni bir ortam (environment) oluştur.
- Paylaşılan alanların tümünü bu ortama ata.
- Ortamı döndür.
Paylaşılan alanlara etkin bağlar (active bindings) aracılığıyla erişilmelidir. Bunlar, daha önce gördüğün diğer etkin bağlar gibi çalışır, ancak alanlara private$shared$ önekiyle erişir.
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
}
}
)
)
Etkin bağın adı, almak ya da atamak istediğin paylaşılan alanın adıyla aynı olmalıdır; yukarıdaki örnekte ikisi de a_shared_field.
Bu egzersiz, kursun bir parçasıdır
R'de S3 ve R6 ile Nesne Yönelimli Programlama
Egzersiz talimatları
Senin için kısmen tanımlanmış bir MicrowaveOven sınıfı var.
MicrowaveOvensınıfının private öğesindesharedadlı alanı güncelle.- Bu alan, süslü parantez
{}içine alınmış üç satır kod içermelidir. - Önce
new.env()(docs) çağrısı ileeadlı yeni bir ortam oluştur, sonra … eiçinesafety_warningadlı ve değeri"Warning. Do not try to cook metal objects."olan bir değişken ata, sonra …- Ortamı döndür.
- Bu alan, süslü parantez
- Özel paylaşılan
safety_warningalanını alan ya da ayarlayansafety_warningadlı bir etkin bağ ekle.- Bunu
activeöğesinin içinde bir fonksiyon olarak tanımla. valueadlı tek bir argüman alır.private$shared$safety_warningüzerinde okuma/yazma yapmalıdır.
- Bunu
- İki tane
MicrowaveOvennesnesi oluştur: adları sırasıylaa_microwave_ovenveanother_microwave_ovenolsun. a_microwave_ovenüzerindekisafety_warningalanını"Warning. If the food is too hot you may scald yourself."olarak değiştir.- Değiştirildiğinden emin olmak için
another_microwave_ovenüzerindekisafety_warningalanına bak.
Uygulamalı etkileşimli egzersiz
Bu egzersizi bu örnek kodu tamamlayarak deneyin.
# 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
___