Kendalikan Daya
Active binding juga dapat digunakan untuk menetapkan field privat. Dalam kasus ini, fungsi binding harus menerima satu argumen bernama "value".
Pola untuk membuat active binding baca/tulis adalah sebagai berikut.
thing_factory <- R6Class(
"Thing",
private = list(
..a_field = "a value"
),
active = list(
a_field = function(value) {
if(missing(value)) {
private$..a_field
} else {
assert_is_a_string(value) # atau asersi lainnya
private$..a_field <- value
}
}
)
)
Nilai ditetapkan seolah-olah binding tersebut adalah variabel data, bukan fungsi.
a_thing <- thing_factory$new()
a_thing$a_field <- "a new value" # bukan a_thing$a_field("a new value")
Latihan ini adalah bagian dari kursus
Pemrograman Berorientasi Objek dengan S3 dan R6 di R
Petunjuk latihan
Kelas oven microwave telah didefinisikan sebagian untuk Anda.
- Perluas definisi kelas oven microwave agar mencakup elemen daftar
active. - Tambahkan active binding pada elemen
activeuntuk mengendalikan tingkat daya.- Fungsi harus bernama
power_level_watts. - Fungsi harus menerima satu argumen bernama
value. - Variabel privat yang diambil/ditetapkan bernama
..power_level_watts. - Gunakan
assert_is_a_number()(docs) untuk memeriksa bahwavalueadalah satu angka. - Gunakan
assert_all_are_in_closed_range()(docs) untuk memeriksa bahwavalueberada antara0dan..power_rating_watts.
- Fungsi harus bernama
- Buat objek oven microwave, dan tetapkan ke
a_microwave_oven. - Ambil tingkat dayanya.
- Coba tetapkan tingkat daya ke nilai
"400", sebagai string. - Coba tetapkan tingkat daya ke
1600. - Tetapkan tingkat daya ke
400.
Latihan interaktif praktis
Cobalah latihan ini dengan menyelesaikan kode contoh berikut.
# Add a binding for power rating
microwave_oven_factory <- R6Class(
"MicrowaveOven",
private = list(
..power_rating_watts = 800,
..power_level_watts = 800
),
# Add active list containing an active binding
___ = ___(
___ = ___(___) {
if(missing(___)) {
# Return the private value
___
} else {
# Assert that value is a number
___
# Assert that value is in a closed range from 0 to power rating
___
# Set the private power level to value
___ <- ___
}
}
)
)
# Make a microwave
a_microwave_oven <- ___
# Get the power level
___
# Try to set the power level to "400"
___ <- ___
# Try to set the power level to 1600 watts
___ <- ___
# Set the power level to 400 watts
___ <- ___