MulaiMulai sekarang secara gratis

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

Lihat Kursus

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 active untuk 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 bahwa value adalah satu angka.
    • Gunakan assert_all_are_in_closed_range() (docs) untuk memeriksa bahwa value berada antara 0 dan ..power_rating_watts.
  • 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
___ <- ___
Edit dan Jalankan Kode