Bắt đầu ngayBắt đầu miễn phí

Điều khiển công suất

Active binding cũng có thể dùng để gán cho các trường private. Trong trường hợp này, hàm binding nên nhận một đối số duy nhất tên là "value".

Mẫu tạo một active binding đọc/ghi như sau.

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) # hoặc một kiểm tra (assertion) khác
        private$..a_field <- value
      }
    }
  )
)

Giá trị được gán như thể binding là một biến dữ liệu, không phải một hàm.

a_thing <- thing_factory$new()
a_thing$a_field <- "a new value" # không phải a_thing$a_field("a new value")

Bài tập này là một phần của khóa học

Lập trình hướng đối tượng với S3 và R6 trong R

Xem khóa học

Hướng dẫn bài tập

Một lớp lò vi sóng đã được định nghĩa một phần cho bạn.

  • Mở rộng định nghĩa lớp lò vi sóng để bổ sung phần tử danh sách active.
  • Thêm một active binding vào phần tử active để điều khiển mức công suất.
    • Hàm nên có tên power_level_watts.
    • Hàm nên nhận một đối số duy nhất tên value.
    • Biến private để get/set có tên ..power_level_watts.
    • Dùng assert_is_a_number() (docs) để kiểm tra value là một số đơn.
    • Dùng assert_all_are_in_closed_range() (docs) để kiểm tra value nằm trong khoảng từ 0 đến ..power_rating_watts.
  • Tạo một đối tượng lò vi sóng và gán vào a_microwave_oven.
  • Lấy mức công suất hiện tại.
  • Thử gán mức công suất bằng giá trị "400", dưới dạng chuỗi.
  • Thử gán mức công suất bằng 1600.
  • Gán mức công suất bằng 400.

Bài tập tương tác thực hành trực tiếp

Hãy thử làm bài tập này bằng cách hoàn thành đoạn mã mẫu này.

# 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
___ <- ___
Chỉnh sửa và Chạy Mã