開始使用免費開始

靜電

R6 類別可以利用 environment 的「參照式複製」行為,讓多個物件共享欄位。若要設定此機制,請定義一個名為 shared 的私有欄位。這個欄位需要用多行來定義。它應該:

  • 建立一個新的 environment。
  • 將任何要共享的欄位指派到該 environment。
  • 回傳此 environment。

共享欄位應透過主動繫結(active binding)來存取。這些繫結和你先前看過的用法相同,但會使用 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
      }
    }
  )
)

請注意,主動繫結的名稱必須與你要讀寫的共享欄位名稱相同;在上例中兩者都是 a_shared_field

本練習屬於課程

在 R 中使用 S3 與 R6 的物件導向程式設計

檢視課程

練習說明

已為你部分定義了一個 MicrowaveOven 類別。

  • MicrowaveOven 類別的 private 區塊中,更新名為 shared 的欄位。
    • 這個欄位應包含以大括號 {} 包起來的三行程式碼。
    • 首先呼叫 new.env()文件)建立一個名為 e 的新 environment,然後……
    • e 中指派一個名為 safety_warning 的變數,值為 "Warning. Do not try to cook metal objects.",然後……
    • 回傳該 environment。
  • 新增一個名為 safety_warning 的主動繫結,用來讀取或設定私有共享的 safety_warning 欄位。
    • active 區塊內將它定義為一個函式。
    • 它接受一個名為 value 的單一參數。
    • 它應該讀取或設定 private$shared$safety_warning
  • 建立兩個 MicrowaveOven 物件,分別命名為 a_microwave_ovenanother_microwave_oven
  • a_microwave_ovensafety_warning 欄位改為 "Warning. If the food is too hot you may scald yourself."
  • 檢視 another_microwave_ovensafety_warning 欄位,確認它已經被修改。

動手互動練習

試著完成這個範例程式碼,體驗一下這個練習。

# 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
___ 
編輯並執行程式碼