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
Petunjuk latihan
Kelas MicrowaveOven telah sebagian didefinisikan untuk Anda.
- Pada elemen private dari kelas
MicrowaveOven, perbarui field bernamashared.- Field ini harus berisi tiga baris kode yang dibungkus dengan kurung kurawal,
{}. - Pertama, panggil
new.env()(docs) untuk membuat environment baru bernamae, lalu … - Tetapkan sebuah variabel ke dalam
ebernamasafety_warning, dengan nilai"Warning. Do not try to cook metal objects.", lalu … - Kembalikan environment tersebut.
- Field ini harus berisi tiga baris kode yang dibungkus dengan kurung kurawal,
- Tambahkan active binding bernama
safety_warningyang mengambil atau menetapkan fieldsafety_warningprivat 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.
- Definisikan ini sebagai fungsi di dalam elemen
- Buat dua objek
MicrowaveOven, masing-masing bernamaa_microwave_ovendananother_microwave_oven. - Ubah field
safety_warningpadaa_microwave_ovenmenjadi"Warning. If the food is too hot you may scald yourself.". - Lihat field
safety_warningpadaanother_microwave_ovenuntuk 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
___