MulaiMulai sekarang secara gratis

Listrik Statis

Kelas R6 dapat memanfaatkan perilaku penyalinan berdasarkan referensi dari environment untuk berbagi field anturobjek. Untuk menyiapkannya, definisikan field privat bernama shared. Field ini membutuhkan beberapa baris untuk didefinisikan. Field tersebut harus:

  • Membuat environment baru.
  • Menetapkan field bersama apa pun ke environment tersebut.
  • Mengembalikan environment itu.

Field yang dibagikan harus diakses melalui active binding. Cara kerjanya sama seperti active binding lain yang telah Anda lihat, tetapi mengambil field dengan awalan 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
      }
    }
  )
)

Perhatikan bahwa nama active binding harus sama dengan nama field bersama yang ingin Anda ambil atau tetapkan; keduanya adalah a_shared_field pada contoh di atas.

Latihan ini adalah bagian dari kursus

Pemrograman Berorientasi Objek dengan S3 dan R6 di R

Lihat Kursus

Petunjuk latihan

Kelas MicrowaveOven telah sebagian didefinisikan untuk Anda.

  • Pada elemen private dari kelas MicrowaveOven, perbarui field bernama shared.
    • Field ini harus berisi tiga baris kode yang dibungkus dengan kurung kurawal, {}.
    • Pertama, panggil new.env() (docs) untuk membuat environment baru bernama e, lalu …
    • Tetapkan sebuah variabel ke dalam e bernama safety_warning, dengan nilai "Warning. Do not try to cook metal objects.", lalu …
    • Kembalikan environment tersebut.
  • Tambahkan active binding bernama safety_warning yang mengambil atau menetapkan field safety_warning privat bersama.
    • Definisikan ini sebagai fungsi di dalam elemen active.
    • Fungsi ini menerima satu argumen bernama value.
    • Fungsi ini harus mengambil atau menetapkan private$shared$safety_warning.
  • Buat dua objek MicrowaveOven, masing-masing bernama a_microwave_oven dan another_microwave_oven.
  • Ubah field safety_warning pada a_microwave_oven menjadi "Warning. If the food is too hot you may scald yourself.".
  • Lihat field safety_warning pada another_microwave_oven untuk memastikan bahwa nilainya telah berubah.

Latihan interaktif praktis

Cobalah latihan ini dengan menyelesaikan kode contoh berikut.

# 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
___ 
Edit dan Jalankan Kode