BaşlayınÜcretsiz başlayın

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

Kursa Göz Atın

Egzersiz talimatları

Senin için kısmen tanımlanmış bir MicrowaveOven sınıfı var.

  • MicrowaveOven sınıfının private öğesinde shared adlı alanı güncelle.
    • Bu alan, süslü parantez {} içine alınmış üç satır kod içermelidir.
    • Önce new.env() (docs) çağrısı ile e adlı yeni bir ortam oluştur, sonra …
    • e içine safety_warning adlı ve değeri "Warning. Do not try to cook metal objects." olan bir değişken ata, sonra …
    • Ortamı döndür.
  • Özel paylaşılan safety_warning alanını alan ya da ayarlayan safety_warning adlı bir etkin bağ ekle.
    • Bunu active öğesinin içinde bir fonksiyon olarak tanımla.
    • value adlı tek bir argüman alır.
    • private$shared$safety_warning üzerinde okuma/yazma yapmalıdır.
  • İki tane MicrowaveOven nesnesi oluştur: adları sırasıyla a_microwave_oven ve another_microwave_oven olsun.
  • a_microwave_oven üzerindeki safety_warning alanı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 üzerindeki safety_warning alanı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
___ 
Kodu Düzenle ve Çalıştır